14
Recursão Computer Science – A Structured Programming Approach Using C Behrouz A. Forouzna & Richard F. Gilberg Heinle Cengage - 3ª. Edição

Recursão

  • Upload
    errin

  • View
    30

  • Download
    0

Embed Size (px)

DESCRIPTION

Recursão. Computer Science – A Structured Programming Approach Using C Behrouz A. Forouzna & Richard F. Gilberg Heinle Cengage - 3ª. Edição. Definição de recursão. Recursão é um processo repetitivo no qual uma função chama ela mesma. Exemplo: definição de fatorial recursivo - PowerPoint PPT Presentation

Citation preview

Page 1: Recursão

Recursão

Computer Science – A Structured Programming Approach Using C

Behrouz A. Forouzna & Richard F. Gilberg

Heinle Cengage - 3ª. Edição

Page 2: Recursão

Definição de recursão

• Recursão é um processo repetitivo no qual uma função chama ela mesma.

Exemplo: definição de fatorial recursivo

Note que a solução recursiva para um problema envolve um caminho de dois sentidos: primeiro o problema é decomposto no sentido top/down e depois resolvido no sentido bottom/up.

Page 3: Recursão

Decomposição do Fatorial(3)

Fatorial(3) = 3 * Fatorial(2)

Fatorial(2) = 2 * Fatorial(1)

Fatorial(1) = 1*Fatorial(0)

Fatorial(0)=1

Fatorial(1) = 1*1 = 1

Fatorial(2) = 2 * 1 = 2

Fatorial(3) = 3 * 2 = 6

Page 4: Recursão

Solução Iterativa

/* soluçao iterativa para o calculo do fatorial */

long Fatorial(int n){// declarações locais long factN = 1;

int i; for (i = 1; i <= n; i++) factN = factN * i; return factN;} //fim fatorial

Page 5: Recursão

Solução recursiva

/* soluçao recursiva para o calculo do fatorial */

long Fatorial(int n){// declarações locais

if (n == 0)return 1;

else return (n*Fatorial(n-1));} //fim fatorial

Page 6: Recursão

Projeto para implementar funções recursivas

Toda função recursiva possui dois elementos:

• Resolver parte do problema (caso base) ou

• Reduzir o tamanho do problema (caso geral).

No caso do nosso exemplo, Fatorial(0) é o caso base

Page 7: Recursão

Regras para projetar uma função recursiva

• Determinar o caso base;• Determinar o caso geral;• Combinar o caso base e o caso geral na função.

Atenção: Cada chamada da função deve reduzir o tamanho do problema e movê-lo em direção do caso base. O caso base deve terminar sem chamar a função recursiva; isto é, executar um return.

Page 8: Recursão

Números de Fibonacci

Números de Fibonacci são uma série na qual cada número é a soma dos dois números anteriores:

0, 1, 1, 2, 3, 5, .....

Para iniciar a série é preciso conhecer os dois primeiros números.

Page 9: Recursão

Generalização da série de Fibonacci

Dados (caso base):

Fibonacci0 = 0;

Fibonacci1 = 1;

Então (caso geral):

Fibonaccin = Fibonaccin-1 + Fibonaccin-2

Page 10: Recursão

Generalização de Fibonacci4

Fib4

Fib3 + Fib2

Fib2 + Fib1 Fib1 + Fib0

Fib1 + Fib0

0 1

0 1

1

Page 11: Recursão

Exercício

1) Escreva uma função que determine a serie de Fibbonacci com n termos.

Long fib(int n)

{

if (n == 0 || n == 1) // caso base

return n;

return (fib(n-1) + fib(n-2)); // caso geral

}

Page 12: Recursão

Limitações da recursão

• Soluções recursivas podem envolver alto overhead devido à chamada de funções;

• A cada chamada da função recursiva, espaço de memória ( na pilha) é alocada. Se o número de chamada recursiva é muito grande, pode não ter espaço suficiente na pilha para executar o programa (segment fault)

Page 13: Recursão

Limitações da recursão

• As funções para determinar o fatorial e a serie de Fibonacci são melhores implementadas por funções iterativas;

Isto significa que soluçoes iterativas são sempre melhores que as recursivas????

NÃO: ALGUNS ALGORITMOS SÃO MAIS FACEIS DE IMPLEMENTAR USANDO RECURSÃO E SÃO MAIS EFICIENTES

Page 14: Recursão

Exercícios

1) Escreva um programa que, dado o valor n, imprima os primeiros n termos da serie de Fibonacci usando a função recursiva long fib(int n).

2) Reescreva a função long fib(int n), na forma iterativa.

3) Avalie o tempo de resposta dos programas.