26
1 Recursividad e Professor Luiz José Hoffmann Filho [email protected]

1 Recursividade Professor Luiz José Hoffmann Filho [email protected]

Embed Size (px)

Citation preview

1

Recursividade

Professor Luiz José Hoffmann [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

19

Funções Recursivas• Exemplo: Série de fibonacci

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)

21

Exercícios4. Implemente um algoritmo para calcular o fatorial

21

Exercícios - Desafio• Elaborar um algoritmo iterativo para o Problema

da Torre de Hanói.• Elaborar um algoritmo recursivo para o Problema

da Torre de Hanói.