• Nenhum resultado encontrado

INF1007: Programação Funções Recursivas. 12/03/2014 (c) Dept. Informática - PUC-Rio 1

N/A
N/A
Protected

Academic year: 2021

Share "INF1007: Programação Funções Recursivas. 12/03/2014 (c) Dept. Informática - PUC-Rio 1"

Copied!
24
0
0

Texto

(1)

12/03/2014 (c) Dept. Informática - PUC-Rio 1

INF1007: Programação 2

(2)

12/03/2014 (c) Dept. Informática - PUC-Rio 2

Tópicos Principais

• Recursão

• Definições recursivas

• Funções Recursivas

• Implementação

• Comportamento

(3)

12/03/2014 (c) Dept. Informática - PUC-Rio 3

Definições Recursivas

• Em uma definição recursiva um item é definido em termos

de si mesmo, ou seja, o item que está sendo definido

aparece 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 do

problema inicial.

(4)

12/03/2014 (c) Dept. Informática - PUC-Rio 4

Definições Recursivas

• Exemplo: o fatorial de um número

0

,

)!

1

(

0

,

1

!

n

se

n

n

n

se

n

Caso BASE Caso BASE Passo Recursivo

(5)

12/03/2014 (c) Dept. Informática - PUC-Rio 5

Definições Recursivas

• Exercício: forneça a definição recursiva para a operação

de potenciação

0

,

0

,

1

) 1 (

n

se

x

x

n

se

x

n n Caso BASE Caso BASE Passo Recursivo

(6)

12/03/2014 (c) Dept. Informática - PUC-Rio 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)

12/03/2014 (c) Dept. Informática - PUC-Rio 7

/* Função recursiva para cálculo do fatorial */ int fat (int n)

{ if (n==0) return 1; else return n*fat(n-1); }

Funções Recursivas

• Exemplo: função recursiva para cálculo de fatorial

0

,

)!

1

(

0

,

1

!

n

se

n

n

n

se

n

Caso BASE Passo Recursivo

(8)

12/03/2014 (c) Dept. Informática - PUC-Rio 8

/* Função recursiva para cálculo de potenciacao */ int pot (int x, int n)

{ if (n==0) return 1; else return x*pot(x,n-1); }

Funções Recursivas

• Exemplo: função recursiva para cálculo de potenci ação

Caso BASE

Passo Recursivo

(9)

12/03/2014 (c) Dept. Informática - PUC-Rio 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 independentes

entre si, como se estivéssemos chamando funções diferentes

(10)

12/03/2014 (c) Dept. Informática - PUC-Rio 10

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); return f; }

-

3

-

3

n r main n f fat(3)

(11)

12/03/2014 (c) Dept. Informática - PUC-Rio 11

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); return f; }

-

2

-

3

-

3

n r main n f fat(3) n f fat(2)

(12)

12/03/2014 (c) Dept. Informática - PUC-Rio 12

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); return f; }

-

1

-

2

-

3

-

3

n r main n f fat(3) n f fat(2) n f fat(1)

(13)

12/03/2014 (c) Dept. Informática - PUC-Rio 13

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); return f; }

-

0

-

1

-

2

-

3

-

3

n r main n f fat(3) n f fat(2) n f fat(1) n f fat(0)

(14)

12/03/2014 (c) Dept. Informática - PUC-Rio 14

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); return f; }

1

0

-

1

-

2

-

3

-

3

n r main n f fat(3) n f fat(2) n f fat(1) n f fat(0)

(15)

12/03/2014 (c) Dept. Informática - PUC-Rio 15

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); return f; }

1

1

-

2

-

3

-

3

n r main n f fat(3) n f fat(2) n f fat(1)

(16)

12/03/2014 (c) Dept. Informática - PUC-Rio 16

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); return f; }

2

2

-

3

-

3

n r main n f fat(3) n f fat(2)

(17)

12/03/2014 (c) Dept. Informática - PUC-Rio 17

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); return f; }

6

3

-

3

n r main n f fat(3)

(18)

12/03/2014 (c) Dept. Informática - PUC-Rio 18

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); return f; }

6

3

n r main

(19)

12/03/2014 (c) Dept. Informática - PUC-Rio 19

Funções Recursivas

• Exemplo: série de Fibonacci



fib(n)

0, se n

0

1, se n

1

fib(n

1)

fib(n

2), se n

1











Passo Recursivo Caso BASE 2 casos

(20)

12/03/2014 (c) Dept. Informática - PUC-Rio 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; else

return (fib(n-1) + fib(n-2)); }

(21)

12/03/2014 (c) Dept. Informática - PUC-Rio 21

Cadeias de caracteres

• Funções recursivas para manipular cadeias de

caracteres:

– baseiam-se em uma definição recursiva

de cadeias de caracteres:

Uma cadeia de caracteres é:

• a cadeia de caracteres vazia; ou

(22)

12/03/2014 (c) Dept. Informática - PUC-Rio 22

Cadeias de caracteres

• Implementação recursiva da função “imprime” e imprime

invertido:

void imprime_rec (char* s) { if (s[0] != '\0') {

printf(“%c”, s[0]); imprime_rec(&s[1]); }

}

void imprime_inv (char* s) { if (s[0] != '\0') {

imprime_inv(&s[1]); printf(“%c”, s[0]); }

(23)

12/03/2014 (c) Dept. Informática - PUC-Rio 23

Cadeias de caracteres

• Implementação recursiva da função “comprimento”:

int comprimento_rec (char* s) { if (s[0] == '\0') return 0; else return 1 + comprimento_rec(&s[1]); }

(24)

12/03/2014 (c) Dept. Informática - PUC-Rio 24

Referências

Waldemar Celes, Renato Cerqueira, José Lucas Rangel,

Introdução a Estruturas de Dados, Editora Campus

(2004)

Referências

Documentos relacionados