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

INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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

INF1007: Programação 2

4 - Funções Recursivas

Page 2: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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

Tópicos Principais

• Recursão

• Definições recursivas

• Funções Recursivas

• Implementação

• Comportamento

Page 3: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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.

Page 4: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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

Definições Recursivas

• Exemplo: o fatorial de um número

0,)!1(

0,1!

nsenn

nsen

Caso BASE Caso BASE

Passo

Recursivo

Page 5: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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( nsexx

nsex

n

n

Caso BASE Caso BASE

Passo

Recursivo

Page 6: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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);

...

}

Page 7: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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!

nsenn

nsen

Caso BASE

Passo

Recursivo

Page 8: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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

Page 9: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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

Page 10: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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)

Page 11: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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)

Page 12: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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)

Page 13: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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)

Page 14: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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)

Page 15: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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)

Page 16: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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)

Page 17: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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)

Page 18: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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

Page 19: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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

BASE

Page 20: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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));

}

Page 21: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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

• um caractere seguido de uma cadeia de caracteres

Page 22: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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]);

}

}

Page 23: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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]);

}

Page 24: INF1007: Programação 2 4 - Funções Recursivas · 12/03/2014 (c) Dept. Informática - PUC-Rio 4 Definições Recursivas • Exemplo: o fatorial de um número u ! ( 1)!, 0 1, 0!

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)

• Capítulo 4 – Funções