Recursividade
Motivação
Definição
Recursão Direta ou Indireta
A → A
A → B
B → A
Recursão
Um exemplo
1! = 1
2! = 2 * 1
3! = 3 * 2 *1
4! = 4 * 3 * 2 * 1
5! = 5 * 4 * 3 * 2 * 1
5!
5 * 4!
4 * 3!
3 * 2!
2 * 1!
1
Função recursiva
Voltando ao exemplo
5!
5 * 4!
4 * 3!
3 * 2!
2 * 1!
1
2 * 1 = 2
3 * 2 = 6
4 * 6 = 24
5 * 24 = 120
1
Valor Final = 120
Função Fatorial Recursiva
n! = n * (n – 1)! para n>1
1! = 1
0! = 1
Implementando em Python
1 def fatorial(n):
2 if (n == 1) or (n == 0):
3 return 1
4 else:
5 return n * fatorial(n-1)
6 print(fatorial(5))
Chamadas recursivas
fat = fatorial(5)
return 5 * fatorial(4)
return 4 * fatorial(3)
return 3 * fatorial(2)
return 2 * fatorial(1)
return 1
Chamadas recursivas
return 5 * fatorial(4)
return 4 * fatorial(3)
return 3 * fatorial(2)
return 2 * 1
fat = fatorial(5)
Chamadas recursivas
return 5 * fatorial(4)
return 4 * fatorial(3)
return 3 * 2
fat = fatorial(5)
Chamadas recursivas
return 5 * fatorial(4)
return 4 * 6
fat = fatorial(5)
Chamadas recursivas
return 5 * 24
fat = fatorial(5)
Chamadas recursivas
fat = 120
fat = fatorial(5)
Teste de mesa da chamada recursiva
Linha | n | Chamada da função | Saída |
6 | ? | Fat(5) – 1ª chamada | 120 |
Linha | n | Chamada da função | Retorno |
1 | 5 | - | |
5 | 5 | 5* Fat(4) – 2ª chamada | 120 |
Linha | n | Chamada da função | Retorno |
1 | 4 | - | |
5 | 4 | 4* Fat(3) – 3ª chamada | 24 |
Linha | n | Chamada da função | Retorno |
1 | 3 | - | |
5 | 3 | 3* Fat(2) – 4ª chamada | 6 |
Linha | n | Chamada da função | Retorno |
1 | 2 | - | |
5 | 2 | 2* Fat(1) – 5ª chamada | 2 |
Linha | n | Chamada da função | Retorno |
1 | 1 | - | |
3 | 1 | - | 1 |
Main
Fat(5)
Fat(4)
Fat(3)
Fat(2)
Fat(1)
Exemplo
…
Genericamente: soma(n) = n + soma(n-1)
Caso base: soma(1) = 1
def soma(n):
if (n == 1):
return 1
else:
return n + soma(n - 1)
Exemplo
Exemplo
n = int(input("Qual o valor de n? "))
print ("O somatorio de 0 a %d :" % n)
print ("%d" % soma(n))
Exemplo
Exemplo
def fibonacci(n):
if (n == 0) or (n == 1):
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
fibonacci(4):
4
3
2
1
1
1
1
+
2
fibonacci(4): 3
0
+
0
1
+
1
2
1
0
+
0
1
3
fibonacci(4):
4
3
2
1
+
fibonacci(4): 3
0
+
1
+
2
1
0
+
1
0
1
1
2
1
0
1
3
Recursão
Usando Depuração com Funções Recursivas
Usando Depuração com Funções Recursivas
Usando Depuração com Funções Recursivas
Assim: 2 * 3 = 2 + 2 + 2
Ou seja: x * y = x + x + ...+ x (y vezes)
Escreva uma função recursiva para o cálculo do produto de dois números, usando apenas o operador de soma.
Exercícios