Jump to content

Funções recursivas


Cláudio

Recommended Posts

Boa tarde a todos.

Estou a estudar Python pela primeira vez e entrei agora nas funções recursivas.

Gostava de saber se alguém me podia ajudar no seguinte exercício:

Escreva a função recursiva uniao(tup1, tup2), que recebe dois tuplos e devolve um tuplo com os elementos de tup1 seguidos dos elementos de tup2 que não pertencem a tup1. O tuplo resultado deve apresentar os elementos pela mesma ordem em que aparecem nos tuplos tup1 e tup2.
Assuma que os tuplos recebidos não têm valores duplicados.

Por exemplo,
>>> uniao((3,1,'a'), (2, 'b', 'c', 1))
(3, 1, 'a', 2, 'b', 'c')


Eu consegui por o código funcional, mas, no entanto, não consegui fazer através de uma função recursiva. Alguém me pode ajudar de como eu devo transformar o codigo em baixo em recursividade?

Código que fiz:

def uniao(tup1, tup2):

lst = []
for i in tup1 + tup2:
if i not in lst:
lst.append(i)
return lst



Obrigado!

Link to comment
Share on other sites

Olá @Cláudio,

Para transformares o teu código numa função recursiva, tens de mudar um pouco a forma como pensas no problema. Uma função recursiva é, basicamente, uma função que se chama a si mesma durante a execução do código. Para além disso, pelo menos um dos teus parâmetros tem de ser alterado de forma à função, a certa altura, terminar.

Bom, teoria à parte, tens 2 tuplos que tens de juntar. Um dos tuplos - tup1 - é, digamos, o teu tuplo base. E o outro tuplo é o que tens de iterar sobre, para adicionar elementos ao tuplo base. Tu resolveste o teu problema iterativamente, mas duma forma que dificulta a conversão para uma função recursiva. Vê esta alternative duma função iterativa para o teu problema:

def iter_uniao(tup1, tup2):
    tup1 = list(tup1)
    for elem in tup2:
        if elem not in tup1:
            tup1.append(elem)
    return tuple(tup1)
  
assert iter_uniao((3, 1, "a"), (2, "b", "c", 1)) == (3, 1, "a", 2, "b", "c")
assert iter_uniao((1, 2), (2, 3)) == (1, 2, 3)

Olhando para esta função acima, converter para uma função recursiva é capaz de ser um pouco mais simples do que o que tinhas antes. Só precisas de 2 coisas para o fazer:

  1. Decidir o caso de paragem (quando a função deve terminar/retornar)
  2. Decidir o que é que altera cada vez que chamas recursivamente a função

Vê se consegues resolver agora 😉. Se precisares de rever alguma teoria, aqui tens um bom artigo sobre o assunto: https://realpython.com/python-thinking-recursively/

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.