Você está na página 1de 35

ECT2303 – Linguagem de Programação

Aula 18 Funções Recursivas

Einstein Santos (UFRN)

Einstein Santos

UFRN

05 de outubro de 2018

ECT2303 – Linguagem de Programação

05 de outubro de 2018 1 / 35
05 de outubro de 2018
1 / 35

Sumário

1 Definição de funções recursivas

2 Exemplos envolvendo funções recursivas

3 Exercícios

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 2 / 35
05 de outubro de 2018
2 / 35

Sumário

1

2

3

Definição de funções recursivas

Exemplos envolvendo funções recursivas

Exercícios

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 3 / 35
05 de outubro de 2018
3 / 35

Definição de funções recursivas

Definição

Uma função é dita recursiva se definida em termos dela mesma. Ou seja, uma função é recursiva quando dentro dela está presente uma instrução de chamada a ela própria.

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 4 / 35
05 de outubro de 2018
4 / 35

Definição de funções recursivas

Definição

Há três pontos que devem ser observados quando se implementa uma função recursiva:

1 definir o problema em termos recursivos;

2 encontrar a condição de parada (ou básica); e

3 verificar se a cada recursão, a condição de parada está mais próxima de ser satisfeita.

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 5 / 35
05 de outubro de 2018
5 / 35

Definição de funções recursivas

Análise de recursão

Potência:

pow(b, e) =

Einstein Santos (UFRN)

1

,

se e = 0 (caso base)

b × pow(b, e 1)

,

se e > 0 (caso recursivo)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 6 / 35
05 de outubro de 2018
6 / 35

Definição de funções recursivas

Análise de recursão

Fatorial:

n! =

Einstein Santos (UFRN)

1

n × (n 1)!

se n = 0 (caso base)

, , se n > 0 (caso recursivo)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 7 / 35
05 de outubro de 2018
7 / 35

Definição de funções recursivas

Análise de recursão

Sequência de Fibonacci:

fib(n) =

0

,

se

n = 0

(caso base)

1

,

se

n = 1

(caso base)

fib(n 1) + fib(n 2)

,

se

n 2

(caso

recursivo)

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 8 / 35
05 de outubro de 2018
8 / 35

Definição de funções recursivas

Recursividade x iteratividade

Todo algoritmo baseado em funções recursivas pode ser transformado em um algoritmo iterativo, sem recursividade. Para esse fim são utili- zados laços.

Apesar de normalmente serem mais lentos que os algoritmos iterati- vos, e de consumirem mais memória, uma das principais vantagens dos algoritmos recursivos é a facilidade de implementação de proble- mas que são inerentemente recursivos.

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 9 / 35
05 de outubro de 2018
9 / 35

Sumário

1

2

3

Definição de funções recursivas

Exemplos envolvendo funções recursivas

Exercícios

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 10 / 35
05 de outubro de 2018
10 / 35

Exemplos envolvendo funções recursivas

Exemplo – Enunciado

Escreva em C++ uma função recursiva que calcule o fatorial de um número inteiro.

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 11 / 35
05 de outubro de 2018
11 / 35

Exemplos envolvendo funções recursivas

Exemplo – Implementação (versão iterativa)

1

long

int

fatorial(int

n)

2

{

3

long

int

fat

=

1;

4

 

5

for(int

i=n; i>=1; i--)

6

 

fat

*=

i;

7

 

8

return

fat;

 

9

}

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 12 / 35
05 de outubro de 2018
12 / 35

Exemplos envolvendo funções recursivas

Exemplo – Implementação (versão recursiva)

1

long

int

fatorial(int

n)

2

{

3

if(n==0

|| n==1)

 

4

 

return

1;

5

else

6

 

return

n

*

fatorial(n-1);

7

}

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 13 / 35
05 de outubro de 2018
13 / 35

Exemplos envolvendo funções recursivas

Exemplo – Enunciado

Escreva em C++ uma função recursiva que calcule o somatório dos números de 1 até um número inteiro n fornecido pelo usuário.

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 14 / 35
05 de outubro de 2018
14 / 35

Exemplos envolvendo funções recursivas

Exemplo – Implementação (versão iterativa)

1

int

somatorio(int

n)

2

{

3

int

soma

=

0;

4

 

5

for(int

i=n; i>=1; i--)

6

 

soma

+=

i;

7

 

8

return

soma;

 

9

}

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 15 / 35
05 de outubro de 2018
15 / 35

Exemplos envolvendo funções recursivas

Exemplo – Implementação (versão recursiva)

1

int

somatorio(int

n)

2

{

3

if(n==1)

 

4

 

return

1;

5

else

6

 

return

n

+

somatorio(n-1);

7

}

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 16 / 35
05 de outubro de 2018
16 / 35

Exemplos envolvendo funções recursivas

Exemplo – Enunciado

Escreva em C++ uma função recursiva que receba um número inteiro positivo n e exiba todos os números naturais de 0 até n em ordem crescente.

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 17 / 35
05 de outubro de 2018
17 / 35

Exemplos envolvendo funções recursivas

Exemplo – Implementação (versão iterativa)

1

void

ordemCrescente(int

n)

2

{

3

4

for(int

i=0; i<=n; i++)

5

 

cout

<<i

<<"

";

6

}

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 18 / 35
05 de outubro de 2018
18 / 35

Exemplos envolvendo funções recursivas

Exemplo – Implementação (versão recursiva)

1

void

ordemCrescente(int

n)

2

{

3

if(n==0){

 

4

 

cout

<<"0 ";

 

5

}else{

 

6

 

ordemCrescente(n-1);

 

7

cout

<<n

<<"

";

8

}

9

}

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 19 / 35
05 de outubro de 2018
19 / 35

Exemplos envolvendo funções recursivas

Exemplo – Enunciado

Escreva em C++ uma função recursiva que receba um número inteiro positivo n e exiba todos os números naturais de 0 até n em ordem decrescente.

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 20 / 35
05 de outubro de 2018
20 / 35

Exemplos envolvendo funções recursivas

Exemplo – Implementação (versão iterativa)

1

void

ordemDecrescente(int

n)

   

2

{

3

4

for(int

i=n; i>=0; i--)

 

5

 

cout

<<i

<<"

";

6

}

 
 

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

 

05 de outubro de 2018

21 / 35

Exemplos envolvendo funções recursivas

Exemplo – Implementação (versão recursiva 1)

1

void

ordemDecrescente(int

n)

   

2

{

3

if(n==0){

 

4

 

cout

<<"0 ";

 

5

}else{

 

6

 

cout

<<n

<<"

";

7

ordemDecrescente(n-1);

 

8

}

9

}

 
 

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

 

05 de outubro de 2018

22 / 35

Exemplos envolvendo funções recursivas

Exemplo – Implementação (versão recursiva 2)

1

void

ordemDecrescente(int

n)

   

2

{

3

if(n!=-1){

 

4

 

cout

<<n

<<"

";

5

ordemDecrescente(n-1);

 

6

}

7

}

 
 

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

 

05 de outubro de 2018

23 / 35

Exemplos envolvendo funções recursivas

Exemplo – Enunciado

Implemente em C++ uma versão recursiva da função pow(b,e) para valores inteiros.

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 24 / 35
05 de outubro de 2018
24 / 35

Exemplos envolvendo funções recursivas

Exemplo – Implementação (versão iterativa)

1

int

pow(int b,

int

e)

2

{

3

int

pot=1;

 

4

 

5

for(int

i=e; i>0; i--)

6

 

pot

*=

b;

7

 

8

return

pot;

 

9

}

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 25 / 35
05 de outubro de 2018
25 / 35

Exemplos envolvendo funções recursivas

Exemplo – Implementação (versão recursiva)

1

int

pow(int b,

int

e)

   

2

{

3

if(e ==

0)

4

 

return

1;

5

else

6

 

return

b

*

pow(b,e-1);

7

}

 
 

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018

26 / 35

Exemplos envolvendo funções recursivas

Exemplo – Enunciado

Faça em C++ uma função recursiva que gere o n-ésimo termo da sequência de Fibonacci.

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 27 / 35
05 de outubro de 2018
27 / 35

Exemplos envolvendo funções recursivas

Exemplo – Implementação (versão iterativa)

1

long

int

fib(int

n)

2

{

3

int

t0=0,

t1=1,

tn;

4

 

5

if(n ==

 

0)

6

return

t0;

7

else

if(n ==

1)

8

return

t1;

9

else{

 

10

for(int

i=2; i<=n; i++){

11

 

tn

=

t0

+

t1;

12

t0

=

t1;

13

t1

=

tn;

14

}

15

return

tn;

16

}

17

}

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 28 / 35
05 de outubro de 2018
28 / 35

Exemplos envolvendo funções recursivas

Exemplo – Implementação (versão recursiva)

1

long

int

fib(int

n)

2

{

3

if(n ==

0)

4

return

0;

5

else

if(n ==

1)

 

6

return

1;

7

else

8

return

fib(n-2)

+

fib(n-1);

9

}

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 29 / 35
05 de outubro de 2018
29 / 35

Exemplos envolvendo funções recursivas

Exemplo – Enunciado

Faça uma função recursiva que dado um vetor de inteiros V de tama- nho n e um número inteiro x, retorne o índice m tal que V[m] == x. Se tal m não existir, a função deve retornar -1.

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 30 / 35
05 de outubro de 2018
30 / 35

Exemplos envolvendo funções recursivas

Exemplo – Implementação (versão iterativa)

1

int

buscaNoVetor(int

V[],

int n,

int

x)

2

{

3

int

m=-1;

 

4

 

5

for(int

i=0; i<n; i++)

 

6

 

if(V[i] == x){

7

 

m

=

i;

8

break;

 

9

 

}

10

 

11

return

 

m;

12

}

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 31 / 35
05 de outubro de 2018
31 / 35

Exemplos envolvendo funções recursivas

Exemplo – Implementação (versão recursiva)

1

int

buscaNoVetor(int

V[],

int n,

int

x)

2

{

3

if((n

-

1)

<

0)

4

 

return

-1;

5

else

if(V[n-1]

==

x)

6

 

return

(n-1);

 

7

else

 

8

 

return

buscaNoVetor(V,n-1,x);

 

9

}

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 32 / 35
05 de outubro de 2018
32 / 35

Sumário

1 Definição de funções recursivas

2 Exemplos envolvendo funções recursivas

3

Exercícios

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 33 / 35
05 de outubro de 2018
33 / 35

Exercícios

1. Faça em C++ uma função recursiva que receba um número inteiro positivo n e que exiba, em ordem crescente, todos os números pares positivos menores ou iguais a n.

2. A função fatorial ímpar (duplo fatorial de um número ímpar) é definida como o produto de todos os números naturais ímpares de 1 até algum número natural ímpar n. Assim, o fatorial duplo de 5 é 5!! = 1 * 3 * 5 = 15. Escreva em C++ uma função recursiva que receba um número inteiro positivo ímpar n e que retorne o fatorial ímpar desse número.

Einstein Santos (UFRN)

ECT2303 – Linguagem de Programação

05 de outubro de 2018 34 / 35
05 de outubro de 2018
34 / 35

Funções Recursivas

Einstein Santos (UFRN)

Fim da aula 18

ECT2303 – Linguagem de Programação

05 de outubro de 2018 35 / 35
05 de outubro de 2018
35 / 35