Recursive function with strings - Python

Asked

Viewed 2,001 times

3

I’m having trouble solving an exercise. The statement is as follows: Implement the annoy(n) function that returns a string containing "annoy " (the word followed by a space) n times. If n is not a strictly positive integer, the function must return an empty string. This function must be implemented using recursion.

Using the above function, implement the elephants(n) function that returns a string containing the letter "An elephant bothers a lot of people..." from 1 to n elephants. If n is not greater than 1, the function should return an empty string. This function should also be implemented using recursion.

For example, the callback elephants(4) must be:

Um elefante incomoda muita gente 2 elefantes incomodam incomodam muito mais 2 elefantes incomodam incomodam muita gente 3 elefantes incomodam incomodam incomodam muito mais 3 elefantes incomodam incomodam incomodam muita gente 4 elefantes incomodam incomodam incomodam incomodam muito mais

How can I implement the second function recursively? So far I’ve only succeeded as an iterative function.

def incomodam(n):
    if n <= 0:
        return ''
    else:
        return 'incomodam ' + incomodam(n - 1)

def elefantes(n):
    if n <= 1:
        return ''
    else:
        count = 1
        string = 'Um elefante incomoda muita gente ' 
        while count < n:
            count += 1
            if count < n:
                string += str(count) + ' elefantes ' + incomodam(count) + 'muito mais '
                string += str(count) + ' elefantes ' + incomodam(count) + 'muita gente '
            else:
                string += str(count) + ' elefantes ' + incomodam(count) + 'muito mais '

    return string
  • Have to [Edit] the question and add your codes?

  • Only get to implement the first function. I will put.

3 answers

6


I did so:

def elefantes(n):
    if n <= 0: return ""
    if n == 1: return "Um elefante incomoda muita gente"
    return elefantes(n - 1) + str(n) + " elefantes " + incomodam(n) + ("muita gente" if n % 2 > 0 else "muito mais") +  + "\r\n"

def incomodam(n):
    if n <= 0: return ""
    if n == 1: return "incomodam "
    return "incomodam " + incomodam(n - 1)

>>> print(elefantes(0))

>>> print(elefantes(1))
Um elefante incomoda muita gente

>>> print(elefantes(2))
Um elefante incomoda muita gente
2 elefantes incomodam incomodam muito mais

>>> print(elefantes(3))
Um elefante incomoda muita gente
2 elefantes incomodam incomodam muito mais
3 elefantes incomodam incomodam incomodam muita gente

>>> print(elefantes(4))
Um elefante incomoda muita gente
2 elefantes incomodam incomodam muito mais
3 elefantes incomodam incomodam incomodam muita gente
4 elefantes incomodam incomodam incomodam incomodam muito mais
  • What the statement actually asks is that all those lines be a single return from the function to call elephants(4), but thank you anyway.

  • I don’t understand. It can’t be separated into two functions, so?

  • can, however all those return lines I put in question have to be a single return, in your code when I make the call elephants(4) she only returns 4 elephants bother bother bother bother much more.

  • True. Look now.

  • There’s still an error in the return, but I think I can fix it, I should, for example, return it like this: elephants(3) An elephant bothers a lot of people 2 elephants bother a lot more 2 elephants bother a lot of people 3 elephants bother a lot more bother a lot more, but returns An elephant bothers a lot of people 2 elephants bother a lot more 3 elephants bother a lot of people

  • Yes, I believe it is now a matter of adjustment.

  • In short - the answer is that the "elephants" function also has to be recursive. And it’s quite correct.

Show 2 more comments

1

I did so:

    def incomodam(n):
        if n >= 1:
            return 'incomodam ' + incomodam(n-1)
        else:
            return ''

    quantidade = 0      
    muito= False        # pra saber em que parte esta da musica

    def elefantes(n):
        global quantidade
        global muito
        if quantidade == 0:
            quantidade,n = n,1
        if n <= quantidade:
            if n == 1:
                muito = True
                return 'Um elefante incomoda muita gente\n'+elefantes(n+1)
            else:
                if muito:
                    muito = False
                    return str(n) + ' elefantes ' + incomodam(n) + 'muito mais\n' + elefantes(n)
                else:
                    muito = True
                    if n+1>quantidade:
                        quantidade = 0
                        return ''
                    else:
                        return str(n) + ' elefantes ' + incomodam(n) + 'muita gente\n' + elefantes(n+1)
        else:
            return ''
  • thanks for the warning

0

I also had to do this code for a course. I realized that the case was special not only for n=1, but also for n=2. For n=2, the function would be called "partially". Therefore, I resolved in this way:

def incomodam(n):
    if n <= 0:
        return ""
    elif n % 1 == 0:
        return "incomodam " + incomodam(n-1)
    else:
        return ""

def elefantes(n):
    if n == 1:
        return "Um elefante incomoda muita gente"
    elif n == 2:
        return elefantes(n-1) + f"\n{n} elefantes "+ incomodam(n) +"muito mais" 
    elif n > 2:
        frase1 = f"\n{n-1} elefantes incomodam muita gente"
        frase2 = f"\n{n} elefantes "+ incomodam(n) +"muito mais"
        return elefantes(n-1) + frase1 +frase2
    else:
        return ""

It is understood that when n=2, only phrase 2 is called, since phrase 1 has to be in the singular...

I suggest using pytest to check the results.

import pytest
@pytest.mark.parametrize("test_input,expected", [
    (0, ""),
    (1, "Um elefante incomoda muita gente"),
    (2, "Um elefante incomoda muita gente\n2 elefantes incomodam incomodam muito mais"),
    (3,"Um elefante incomoda muita gente\n2 elefantes incomodam incomodam muito mais\n2 elefantes incomodam muita gente\n3 elefantes incomodam incomodam incomodam muito mais"),
    (4,"Um elefante incomoda muita gente\n2 elefantes incomodam incomodam muito mais\n2 elefantes incomodam muita gente\n3 elefantes incomodam incomodam incomodam muito mais\n3 elefantes incomodam muita gente\n4 elefantes incomodam incomodam incomodam incomodam muito mais"),
    (-1,""),
])
def test_eval(test_input, expected):
    assert elefantes(test_input) == expected

Browser other questions tagged

You are not signed in. Login or sign up in order to post.