1 Recursividade Professor Luiz José Hoffmann Filho [email protected].
-
Upload
ruth-barreiro-de-sequeira -
Category
Documents
-
view
219 -
download
0
Transcript of 1 Recursividade Professor Luiz José Hoffmann Filho [email protected].
2
Tópicos Principais• Recursão
o Definições recursivas
• Funções Recursivaso Implementação
o Comportamento
4/39
MotivaçãoRecursividade é uma idéia inteligente que desempenha um papel central na programação funcional e na ciência da computação em geral.
Recursividade é o mecanismo de programação no qual uma definição de função ou de outro objeto refere-se ao próprio objeto sendo definido.
Assim função recursiva é uma função que é definida em termos de si mesma.
Recursividade é o mecanismo básico para repetições nas linguagens funcionais.
São sinônimos: recursividade, recursão, recorrência.
5/39
1
2
3
EstratégiaEstratégia para a definição recursiva de uma função:• dividir o problema em problemas menores do mesmo tipo
resolver os problemas menores (dividindo-os em problemas ainda menores, se necessário) combinar as soluções dos problemas menores para formar a solução final
• Ao dividir o problema sucessivamente em problemas menores eventualmente os casos simples são alcançados: o não podem ser mais divididos suas soluções são definidas
explicitamente
3
Definições Recursivas
• Em uma definição recursiva um item é definido em termosde si mesmo, ou seja, o item que está sendo definidoaparece como parte da definição;
• Em todas as funções recursivas existe:– Caso base (um ou mais) cujo resultado é imediatamente
conhecido.
– Passo recursivo em que se tenta resolver um sub-problema doproblema inicial.
4
Definições Recursivas
• Exemplo: o fatorial de um número
n! = 1, se n = 0
n× (n − 1)!, se n >
0
Caso BASE
PassoRecursivo
5
Definições Recursivas
• Exercício: forneça a definição recursiva para a operaçãode potenciação
Caso BASE
xn = 1, se n = 0 x * x(n-1), se n > 0
PassoRecursivo
6
Funções Recursivas
• Definição:– Uma função recursiva é aquela que faz uma chamada para si
mesma. Essa chamada pode ser:
• direta: uma função A chama a ela própria
• indireta: função A chama uma função B que, por sua vez, chama A
/* Recursao direta */void func_rec(int n){
...func_rec(n-1);...
}
7
{if (n==0)
return 1;else
return n*fat(n-1);}
Funções Recursivas
• Exemplo: função recursiva para cálculo de fatorial
n! = 1, se n = 0
n * (n − 1)!, se n > 0
/* Função recursiva para cálculo do fatorial */int fat (int n)
Caso BASE
PassoRecursivo
8
{if (n==0)
return 1;else
return x*pot(x,n-1);}
Caso BASE
PassoRecursivo
Funções Recursivas
• Exemplo: função recursiva para cálculo de potenciação
xn = 1, se n = 0 x * x(n-1), se n > 0
/* Função recursiva para cálculo de potenciacao */int pot (int x, int n)
9
Funções Recursivas
• Comportamento:– quando uma função é chamada recursivamente,
cria-se um ambiente local para cada chamada
– as variáveis locais de chamadas recursivas são independentesentre si, como se estivéssemos chamando funções diferentes
return f;
Funções Recursivas#include <stdio.h>int fat (int n);int main (void){ int n = 3;
int r;r = fat ( n );printf("Fatorial de %d = %d \n", n, r);return 0;
}
/* Função recursiva para cálculo do fatorial */int fat (int n)
int f;if (n==0)
f=1;else
f= n*fat(n-1);
{
}
-
3
-
3
f
fat(3)n
r
main n
return f;
Funções Recursivas#include <stdio.h>int fat (int n);int main (void){ int n = 3;
int r;r = fat ( n );printf("Fatorial de %d = %d \n", n, r);return 0;
}
/* Função recursiva para cálculo do fatorial */int fat (int n)
int f;if (n==0)
f=1;else
f= n*fat(n-1);
{
}
-2
-
3
-
3
f
fat(3)n
r
main n
f
fat(2)n
return f;
Funções Recursivas#include <stdio.h>int fat (int n);int main (void){ int n = 3;
int r;r = fat ( n );printf("Fatorial de %d = %d \n", n, r);return 0;
}
/* Função recursiva para cálculo do fatorial */int fat (int n)
int f;if (n==0)
f=1;else
f= n*fat(n-1);
{
}
-1-2
-
3
-
3
f
fat(3)n
r
main n
fat(2)n
f
fat(1)n
f
return f;
Funções Recursivas#include <stdio.h>int fat (int n);int main (void){ int n = 3;
int r;r = fat ( n );printf("Fatorial de %d = %d \n", n, r);return 0;
}
/* Função recursiva para cálculo do fatorial */int fat (int n)
int f;if (n==0)
f=1;else
f= n*fat(n-1);
{
}
-0-1-2
-
3
-
3
f
fat(3)n
r
main n
fat(2)n
f
fat(1)n
f
f
fat(0)n
return f;
Funções Recursivas#include <stdio.h>int fat (int n);int main (void){ int n = 3;
int r;r = fat ( n );printf("Fatorial de %d = %d \n", n, r);return 0;
}
/* Função recursiva para cálculo do fatorial */int fat (int n)
int f;if (n==0)
f=1;else
f= n*fat(n-1);
{
}
10-1-2
-
3
-
3
f
fat(3)n
r
main n
fat(2)n
f
fat(1)n
f
f
fat(0)n
return f;
Funções Recursivas#include <stdio.h>int fat (int n);int main (void){ int n = 3;
int r;r = fat ( n );printf("Fatorial de %d = %d \n", n, r);return 0;
}
/* Função recursiva para cálculo do fatorial */int fat (int n)
int f;if (n==0)
f=1;else
f= n*fat(n-1);
{
}
11-2
-
3
-
3
f
fat(3)n
r
main n
fat(2)n
f
fat(1)n
f
return f;
Funções Recursivas#include <stdio.h>int fat (int n);int main (void){ int n = 3;
int r;r = fat ( n );printf("Fatorial de %d = %d \n", n, r);return 0;
}
/* Função recursiva para cálculo do fatorial */int fat (int n)
int f;if (n==0)
f=1;else
f= n*fat(n-1);
{
}
22
-
3
-
3
f
fat(3)n
r
main n
f
fat(2)n
return f;
Funções Recursivas#include <stdio.h>int fat (int n);int main (void){ int n = 3;
int r;r = fat ( n );printf("Fatorial de %d = %d \n", n, r);return 0;
}
/* Função recursiva para cálculo do fatorial */int fat (int n)
int f;if (n==0)
f=1;else
f= n*fat(n-1);
{
}
6
3
-
3
f
fat(3)n
r
main n
return f;
Funções Recursivas#include <stdio.h>int fat (int n);int main (void){ int n = 3;
int r;r = fat ( n );printf("Fatorial de %d = %d \n", n, r);return 0;
}
/* Função recursiva para cálculo do fatorial */int fat (int n){
int f;if (n==0)
f=1;else
f= n*fat(n-1);
}
6
3
r
main n
20
Funções Recursivas
• Exemplo: série de Fibonacci
/* Calculo da serie de Fibonacci */int fib (int n){
if (n==0)return 0;
else if (n==1)return 1;
elsereturn (fib(n-1) + fib(n-2));
}
21
Exercícios1. Crie a função recursiva para calcular o terminal
de um número n, definido da seguinte maneira:
2. A multiplicação de números naturais pode ser definida da segunte forma:
21
•
Exercícios3. Determine o que o seguinte procedimento
recursivo computa. Escreva um procedimento não recursivo (ou iterativo) para para solucionar o mesmo problema.
Funcao(n) {se n = 0 entao
retorne 0senao
retorne n + Funcao (n-1)