Recursividade em Python-2022
Recursividade em Python-2022
Capítulo
12 FUNÇÕES RECURSIVAS
Apresentamos problemas e funções recursivas. Como extra, da cultura do pensamento
computacional, falamos sobre paradigmas de programação e jeito pythônico de codificação.
Uma forma simples de inverter uma lista é pela manipulação de fatias, assim
reverso(x) = x[::-1]. Mas vamos programar outras formas para exercitar a solução do
problema:
i) rev: iniciar no índice len()-1, até 0, diminuindo de 1; fica range(len(s)-1,-1,-1);
ii) rev1: percorrer a lista com for tirando do inicio da lista e colocando no final;
iii)rev2: idem com recursividade, sem o for.
def rev(s):
REV=[]
for i in range(len(s)-1,-1,-1):
REV.append(s[i])
return REV
print('rev abcdef:',*rev(list('abcdef')))
>>>
rev abcdef: f e d c b a
Abaixo com o Python tutor vemos a lista REV sendo construída na forma reversa. Passo a
passo os elementos de trás -1 para frente (com passo -1) são copiados para a nova lista,
REV.
© E.L.Favero Algoritmos em Python 89
O append sempre acrescenta um elemento no final da lista. Mas o + é mais flexível podendo
concatenar quaisquer duas listas, assim podemos percorrer a lista do início para o fim e
sempre ir acrescentando na frente da nova lista REV sendo formada. O + concatena duas
lista portanto o elemento s[i] é colocado dentro de uma lista [s[i]].
def rev1(s):
REV=[]
for i in range(len(s)):REV=[s[i]]+REV
return REV
def rev2(s):
if s!=[]: return rev2(s[1:])+[s[0]] # recursividade
else: return [] # base: fim
Uma função é recursiva se ela se chama a si mesma: na linha do def, ela é definda, e
dentro do seu corpo, ela já é chamada antes de termos terminado sua definição. Dentro do
corpo: uma linha ela se chama recursivamente (caso recursivo) e na outra linha ela termina
a recusividade (caso base).
Abaixo no Python Tutor vemos que primeiro a função vai se chamando e a lista de
entrada diminui até ficar vazia. As funções recursivas vão se empilhando dentro da máquina
abstrata de execução do Python. Depois de chegar no vazio da lista da entrada, as funções
vão gerando o retorno, com as listas parciais invertidas.
© E.L.Favero Algoritmos em Python 90
Com mais dois passos next, vemos o retorno da lista parcial [c,d] invertida, agora [d,c].
Continuando com next as funções são removidas da pilha de execução e o resultado vem
sendo montado, até se chegar em [d,c,b,a]. Para animar funções recursivas no Python Tutor
utilize entradas pequenas de no máximo 5 elementos.
Abaixo temos um teste comparando as três versões de reverse, para mostar que elas geram
o mesmo resultado.
li=list("123456")
print('rev:', *rev(li), 'rev1:', *rev1(li),'rev2:', *rev2(li)
>>>
rev: 6 5 4 3 2 1 rev1: 6 5 4 3 2 1 rev2: 6 5 4 3 2 1
© E.L.Favero Algoritmos em Python 91
Agora que temos várias versões de reverse vamos programar duas versões da função
palíndromo, a primeira mais fácil de ler, x==rev(x) e a segunda um pouco mais abstrata
x==x[::-1].
print(palídromo(list('abcdeedcba')))
print(palídromo(list('12321')))
print(palídromo1(list('12321')))
print(palídromo1(list('123X21')))
>>>
True
True
True
False
As folhas da Bromélia são formadas por espirais, cujos raios pertencem a série de
Fibonacci. Esta série foi descoberta pelo matemático Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34,
... Ele mostrou a série com o exemplo do crescimento acelerado da população de coelhos,
com a fórmula recursiva:
Segue o programa recursivo que codifica esta série. São dois casos na fórmulas, então
temos um comando if para decidir qual dos casos será executado a partir do valor de n;
caso base ou caso recursivo. No teste abaixo com n=3, o terceiro elemento da série é 2 e o
sexto elemento é o 8.
© E.L.Favero Algoritmos em Python 92
def fibo(n):
if n<=1: return n # base: fim
else: return fibo(n-1)+fibo(n-2) # recursividade
print(fibo(3))
print(fibo(6))
for i in range(0,10): print(fibo(i),end=' ')
>>>
2
8
0 1 1 2 3 5 8 13 21 34
Abaixo com o Python tutor podemos ver as várias chamadas de fibo() até termos um
primeiro retorno para fibo(1). Com next e prev podemos navegar sobre a execução das
chamadas recursivas, para compreender melhor como ocorre a recursão.
© E.L.Favero Algoritmos em Python 93
E12.1 Faça a função reverse usando um for e range: iniciar no índice len()-1, até 0,
diminuindo de 1; fica range(len(s)-1,-1,-1)
def rev(s):
REV=[]
for i in range(len(s)-1,-1,-1):
REV.append(s[i])
return REV
print('rev abcdef:',rev(list('abcdef')))
E12.2 Faça a função reverse: percorrer a lista do início para o fim com for e sempre ir
acrescentando na frente da nova lista REV sendo formada, use o + para concatenar
na frente de REV.
E12.3 Faça a função reverse com a estratégia da questão anterior, substituindo o for por
recursividade: percorrer a lista do início para o fim e sempre ir acrescentando na
frente da nova lista REV sendo formada, use o + para concatenar
E12.6 Faça a função palídromo sem usar uma lista invertida. Comparando sempre os dois
extremos, em direção ao meio. Use índices para fazer as comparações.