Você está na página 1de 3

Como eu posso entender recursão?

EMB5630
Programação II
Capı́tulo 3 - Recursão
Para entender recursão, você deve primeiro entender recursão.

Prof. Pablo Andretta Jaskowiak

pablo.andretta@ufsc.br

1 2

Recursão: Droste Effect

Conceitos Básicos

Figure 1: Albúm Ummagumma, Pink Floyd, 1969.

Introdução

• Recursão é um método ou técnica para resolução de problemas


• A resolução de um problema é obtida da decomposição do problema
original em subproblemas do mesmo tipo, que são então resolvidos
• Cada subproblema é resolvido recursivamente, até que se encontre
um subproblema com resposta conhecida, que não necessita recursão

• Em programação, na sua forma mais simples, uma função é dita


recursiva quando chama ela mesma (é definida em termos de si) Definindo funções recursivas
• Esta forma é conhecida como recursão direta

• Outra forma de recursão é obtida, por exemplo, quando uma função


a chama uma função b e a função b chama então a função a
• Esta forma é conhecida como recursão indireta

Uma função é recursiva é aquela que chama


a si mesma, direta ou indiretamente

4
Definindo uma função recursiva Definindo uma função recursiva

• Na matemática muitos problemas são descritos recursivamente


Dado um problema, devemos verificar se ele pode ser dividido em um ou
• Um problema recursivo clássico é o fatorial de um número
mais subproblemas menores que podem ser resolvidos da mesma forma
( que o problema original. Se esse for o caso, devemos definir então
1 caso n = 0
n! =
n(n − 1)! caso n > 0 • O caso base da função recursiva: passo resolvido sem recursão, que
só retorna um valor conhecido, ou obtido de forma não recursiva
• A definição apresentada é recursiva, composta de duas partes • O passo indutivo da função recursiva: resolução do problema em
• Um caso base, definido trivialmente, não recursivo termos da própria função, a chamada recursiva em si
• Uma para a própria função, que é o passo recursivo

5 6

Definindo uma função recursiva: fatorial Definindo uma função recursiva: fibonnaci

1 int fatorial ( int n ) {


2 if ( n <= 1) Números de Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, . . .
3 return 1;
4 else
5 return n * fatorial (n -1) ;
6 }


0 caso n = 0


Fib(n) = 1 caso n = 1
Todas chamadas de função, como já vimos, são colocadas na pilha 

Fib(n − 1) + Fib(n − 2) caso n > 1
• Inclusive as chamadas recursivas de função

7 8

Definindo uma função recursiva: fibonnaci

1 int Fib ( int n ) {


2 if ( ( n == 0) || ( n == 1) )
3 return n ;
4 else
5 return Fib (n -1) + Fib (n -2) ;
6 }

Árvore de recursão obtida com Fib(5). Casos base marcados em azul.


Recursão / Iteração

9
Recursão / Iteração Recursão / Iteração

A recursão produz um comportamento iterativo (ou de repetição), com


algumas diferenças em relação a um laço de repetição (for, while, etc)

• A recursão não usa um laços, mas sim uma estrutura de seleção e


chamadas de função que resultam em comportamento repetitivo Em ambos os casos

• Funções iterativas geralmente ocupam espaço constante, ao passo • Se o caso de parada não estiver bem definido, teremos repetições
que cada chamada de função recursiva ocupa mais espaço na pilha infinitas. Em recursão, causará estouro da pilha, quando o espaço
• Funções recursivas tendem a ser mais lentas que funções iterativas, ocupado pelas chamadas recursivas exceder o tamanho da pilha.
devido ao overhead de chamadas de função e sua criação na pilha
• Para determinados problemas as soluções recursivas são mais
elegantes, simples e práticas. Podem, porém, usar mais memória

10 11

Atividades Problemas Clássicos

• Implemente de forma recursiva Alguns problemas clássicos em recursão


• Uma função que recebe dois valores, um de base (b) e outro de • Torres de Hanoi
expoente (e) e retorne o valor de b e . Use somente multiplicação.

• Triângulo de Pascal
• Uma função recursiva para imprimir um vetor, na ordem usual

• Uma função recursiva para imprimir um vetor, na ordem reversa • Máximo divisor comum

• Uma função recursiva para verificar se uma palavra é palı́ndrome • Função de Ackermann

12 13

Você também pode gostar