recursividade

61
Prof. Sérgio Souza Costa Recursividade

Upload: sergio-souza-costa

Post on 18-Jun-2015

8.286 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Recursividade

Prof. Sérgio Souza Costa

Recursividade

Page 2: Recursividade

Recursividade

• Muitas estruturas de dados como listas e árvores são recursivas, então é importante compreender conceito de recursividade.

*

Page 3: Recursividade

▪ A recursividade é uma forma de resolver problemas por meio da divisão

dos problemas em problemas menores de mesma natureza.

▪ Se a natureza dos subproblemas é a mesma do problema, o mesmo

método usado para reduzir o problema pode ser usado para reduzir os

subproblemas e assim por diante.

▪ Quando devemos parar? Quando alcançarmos um caso trivial que

conhecemos a solução.

*

Recursividade

Page 4: Recursividade

Recursividade

• Exemplos de casos triviais:– Qual o fatorial de 0 ?

– Quanto é um dado X multiplicado por 1 ?

– Quanto é um dado X multiplicado por 0 ?

– Quanto é um dado X elevado a 1 ?

– Quantos elementos tem em uma lista vazia?

Page 5: Recursividade

▪ Assim, um processo recursivo para a solução de um problema consiste em duas partes:▪ O caso trivial, cuja solução é conhecida;▪ Um método geral que reduz o problema a um ou mais

problemas menores (subproblemas) de mesma natureza.

▪ Muitas funções podem ser definidas recursivamente. Para isso, é preciso identificar as duas partes acima.

▪ Exemplo: fatorial de um número e o n-ésimo termo da seqüência de Fibonacci.

*

Recursividade

Page 6: Recursividade

Função fatorial

▪ A função fatorial de um inteiro não negativo pode ser definida como:

▪ Esta definição estabelece um processo recursivo para calcular o fatorial de um inteiro n.

▪ Caso trivial: n=0.

▪ Método geral: n x (n-1)!.

*

Page 7: Recursividade

Função fatorial

▪ Assim, usando-se este processo recursivo, o cálculo de 4!, por exemplo, é feito como a seguir:

*

4! =

Page 8: Recursividade

Função fatorial

▪ Assim, usando-se este processo recursivo, o cálculo de 4!, por exemplo, é feito como a seguir:

*

4! = 4 * 3!

Page 9: Recursividade

Função fatorial

▪ Assim, usando-se este processo recursivo, o cálculo de 4!, por exemplo, é feito como a seguir:

4! = 4 * 3! = 4 * (3 * 2!)

Page 10: Recursividade

Função fatorial

▪ Assim, usando-se este processo recursivo, o cálculo de 4!, por exemplo, é feito como a seguir:

4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!))

Page 11: Recursividade

Função fatorial

▪ Assim, usando-se este processo recursivo, o cálculo de 4!, por exemplo, é feito como a seguir:

4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!)) = 4 * (3 * (2 * (1 * 0!)))

Page 12: Recursividade

Função fatorial

▪ Assim, usando-se este processo recursivo, o cálculo de 4!, por exemplo, é feito como a seguir:

4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!)) = 4 * (3 * (2 * (1 * 0!))) = 4 * (3 * (2 * (1 * 1)))

Page 13: Recursividade

Função fatorial

▪ Assim, usando-se este processo recursivo, o cálculo de 4!, por exemplo, é feito como a seguir:

4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!)) = 4 * (3 * (2 * (1 * 0!))) = 4 * (3 * (2 * (1 * 1))) = 4 * (3 * (2 * 1))

Page 14: Recursividade

Função fatorial

▪ Assim, usando-se este processo recursivo, o cálculo de 4!, por exemplo, é feito como a seguir:

4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!)) = 4 * (3 * (2 * (1 * 0!))) = 4 * (3 * (2 * (1 * 1))) = 4 * (3 * (2 * 1)) = 4 * (3 * 2)

Page 15: Recursividade

Função fatorial

▪ Assim, usando-se este processo recursivo, o cálculo de 4!, por exemplo, é feito como a seguir:

4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!)) = 4 * (3 * (2 * (1 * 0!))) = 4 * (3 * (2 * (1 * 1))) = 4 * (3 * (2 * 1)) = 4 * (3 * 2) = 4 * 6

Page 16: Recursividade

Função fatorial

▪ Assim, usando-se este processo recursivo, o cálculo de 4!, por exemplo, é feito como a seguir:

*

4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!)) = 4 * (3 * (2 * (1 * 0!))) = 4 * (3 * (2 * (1 * 1))) = 4 * (3 * (2 * 1)) = 4 * (3 * 2) = 4 * 6 = 24

Mas como uma função recursivaé de fato implementada no computador?Usando-se o mecanismo conhecido comoPilha de Execução!

Page 17: Recursividade

Função fatorial

▪ Considere, novamente, o exemplo para 4!:

*

fatorial(4) -> return 4*fatorial(3)

Pilha de Execução

Page 18: Recursividade

Função fatorial

▪ Considere, novamente, o exemplo para 4!:

*

fatorial(4) -> return 4*fatorial(3)

fatorial(3) -> return 3*fatorial(2)

Pilha de Execução

Page 19: Recursividade

Função fatorial

▪ Considere, novamente, o exemplo para 4!:

*

fatorial(4) -> return 4*fatorial(3)

fatorial(3) -> return 3*fatorial(2)

fatorial(2) -> return 2*fatorial(1)

Pilha de Execução

Page 20: Recursividade

Função fatorial

▪ Considere, novamente, o exemplo para 4!:

*

fatorial(4) -> return 4*fatorial(3)

fatorial(3) -> return 3*fatorial(2)

fatorial(2) -> return 2*fatorial(1)

fatorial(1) -> return 1*fatorial(0)

Pilha de Execução

Page 21: Recursividade

Função fatorial

▪ Considere, novamente, o exemplo para 4!:

*

fatorial(4) -> return 4*fatorial(3)

fatorial(3) -> return 3*fatorial(2)

fatorial(2) -> return 2*fatorial(1)

fatorial(1) -> return 1*fatorial(0)

fatorial(0) -> return 1 (caso trivial)

Pilha de Execução

Page 22: Recursividade

Função fatorial

▪ Considere, novamente, o exemplo para 4!:

*

fatorial(4) -> return 4*fatorial(3)

fatorial(3) -> return 3*fatorial(2)

fatorial(2) -> return 2*fatorial(1)

fatorial(1) -> return 1*fatorial(0)

fatorial(0) -> return 1 (caso trivial)

Pilha de ExecuçãoDesempilha fatorial(0)

Page 23: Recursividade

Função fatorial

▪ Considere, novamente, o exemplo para 4!:

*

fatorial(4) -> return 4*fatorial(3)

fatorial(3) -> return 3*fatorial(2)

fatorial(2) -> return 2*fatorial(1)

fatorial(1) -> return 1*1

Desempilha fatorial(1)

Page 24: Recursividade

Função fatorial

▪ Considere, novamente, o exemplo para 4!:

*

fatorial(4) -> return 4*fatorial(3)

fatorial(3) -> return 3*fatorial(2)

fatorial(2) -> return 2*1*1

Desempilha fatorial(2)

Page 25: Recursividade

Função fatorial

▪ Considere, novamente, o exemplo para 4!:

*

fatorial(4) -> return 4*fatorial(3)

fatorial(3) -> return 3*2*1*1

Desempilha fatorial(3)

Page 26: Recursividade

Função fatorial

▪ Considere, novamente, o exemplo para 4!:

*

fatorial(4) -> return 4*3*2*1*1

Desempilha fatorial(4)

Page 27: Recursividade

Função fatorial

▪ Considere, novamente, o exemplo para 4!:

*

Resultado = 24

Page 28: Recursividade

Recursividade

*

"Para fazer um procedimento recursivo é preciso ter fé.”prof. Siang Wun Song

Page 29: Recursividade

Recursividade

*

"Para fazer um procedimento recursivo é preciso ter fé.”prof. Siang Wun Song

"Ao tentar resolver o problema, encontrei obstáculos dentro de obstáculos. Por isso, adotei uma solução recursiva.” Aluno S.Y., 1998

Page 30: Recursividade

Recursividade

*

"Para fazer um procedimento recursivo é preciso ter fé.”prof. Siang Wun Song

"Ao tentar resolver o problema, encontrei obstáculos dentro de obstáculos. Por isso, adotei uma solução recursiva.” Aluno S.Y., 1998

"To understand recursion, we must first understand recursion.” —anônimo

Page 31: Recursividade

Funções recursivas

• Base do paradigma funcional.– ○ Lisp, Haskell, Miranda, F#, Scheme, Erland

– Influenciou diversas: JavaScript, Python,Ruby, Lua

• Presente em praticamente todas as linguagens, mesmo as imperativas, como – C, Java, Pascal, ADA ...

*

Page 32: Recursividade

Funções recursivas

• Muitos algoritmos complexos são resolvidos através de soluções recursivas– Quick-sort (ordenação rápida)

– Ordenação por intercalação (merge sort)

– Busca binária

• Muitas estruturas de dados são recursivas– Listas encadeadas

– Árvores binárias, n-árias ...

• Tendem a gerar códigos menores

*

Page 34: Recursividade

Recursividade - Natureza

*

Page 35: Recursividade

Vamos fazer mais um exercício. Na atividade de aprofundamento tem mais exercícios. Tentem fazer e postem suas dúvidas.

Page 36: Recursividade

Exercício resolvido

• Codifiquem uma função que multiplica um dado inteiro “a” por um inteiro “b”, usando somas sucessivas. Exemplo:

• 4 * 3 = 3+ 3+ 3 +3 = 12

Page 37: Recursividade

Exercício resolvido

int mult (int a, int b) {

}

Page 38: Recursividade

Exercício resolvido

int mult (int a, int b) {if (a == 0)

return

}

Page 39: Recursividade

Exercício resolvido

int mult (int a, int b) {if (a == 0)

return 0;

}

Page 40: Recursividade

Exercício resolvido

int mult (int a, int b) {if (a == 0)

return 0;

if (a == 1)return

}

Page 41: Recursividade

Exercício resolvido

int mult (int a, int b) {if (a == 0)

return 0;

if (a == 1)return b;

}

Page 42: Recursividade

Exercício resolvido

int mult (int a, int b) {if (a == 0)

return 0;

if (a == 1)return b;

return b + mult (a-1,b);}

Page 43: Recursividade

Vamos testar ?

Page 44: Recursividade

Vamos testar ?

mult (3,5)

Page 45: Recursividade

Vamos testar ?

mult(3,5)=5+mult(2,5)

Page 46: Recursividade

Vamos testar ?

mult(3,5)=5+mult(2,5) =5+5+mult(1,5)

Page 47: Recursividade

Vamos testar ?

mult(3,5)=5+mult(2,5) =5+5+mult(1,5) =5+5+5

Page 48: Recursividade

Vamos testar ?

mult(3,5)=5+mult(2,5) =5+5+mult(1,5) =5+5+5

= 15

Page 49: Recursividade

1. Faça uma função recursiva que calcula a divisão usando subtrações sucessivasint div (int a, int b);

2. Faça uma função recursiva que calcula o resto de uma divisão usando subtrações sucessivas.int mod (int a, int b);

3.Faça uma função recursiva que calcula a potencia de um numero usando multiplicações sucessivas.int pot (int base, int exp);

4. Faça uma função recursiva que calcula a quantidade de caracteres em uma string.int tamanho (char *str)

5. Fazer uma função recursiva que calcule o valor da série S descrita a seguir para um valor n > 0 a ser fornecido como parâmetro para a mesma:S = 1 + 1/2! + 1/3! + ... 1/n!

Exercícios

Page 50: Recursividade

Tipos Recursivos

Um tipo recursivo é definido em termos de si.

Exemplos de tipos recursivos:● listas● árvores

A cardinalidade de tipos recursivos é infinita. Os números naturais é outro exemplo de tipos recursivos

Page 51: Recursividade

Axiomas de PeanoO matemático Giuseppe Peano (1858-1932) apresentou alguns axiomas sobre números naturais, que ficaram posteriormente conhecidos como os Axiomas de Peano. Nele precisamos admitir três conceitos primitivos. São eles: zero (denotado por 0), número natural e a noção de sucessor de um número natural. Estes axiomas são listados abaixo:

(A1) 0 (zero) e ́ um nu ́mero natural e na ̃o e ́ sucessor de um nu ́mero natural2.(A2) Todo nu ́mero natural tem um u ́nico sucessor,

que tambe ́m e ́ um nu ́mero natural.

(A3) Se dois nu ́meros naturais tem o mesmo sucessor,

enta ̃o eles sa ̃o iguais entre si.

(A4) Se um subconjunto S dos nu ́meros naturais

possui o elemento zero e tambe ́m o sucessor de todos

os elementos de S, enta ̃o S e ́ igual ao conjunto dos

nu ́meros naturais.

Page 52: Recursividade

Tipos Recursivos - Naturais

Exemplos:

0 -> Zero

Page 53: Recursividade

Tipos Recursivos - Naturais

Exemplos:

0 -> Zero1 -> Succ (Zero)

Page 54: Recursividade

Tipos Recursivos - Naturais

Exemplos:

0 -> Zero1 -> Succ (Zero) 2- > Succ ( Succ (Zero))

Page 55: Recursividade

Tipos Recursivos - Naturais

Exemplos:

0 -> Zero1 -> Succ (Zero) 2- > Succ ( Succ (Zero))3- > Succ ( Succ ( Succ (Zero)))...

Page 56: Recursividade

typedef struct Nat {struct Nat* ant;

}* Nat;

Nat Zero () {return NULL;

}Nat Succ (Nat a) {

Nat n = malloc (sizeof (Nat));n->ant = a;return n;

}Nat ant (Nat a) {

return a->ant;}

Numeros Naturais

Definição da estrutura. Observe a recursão.

Função que define o Zero

Função que retorna o sucessor de um dado a.

Função que retorna o antecessor de um dado a.

Page 57: Recursividade

typedef struct Nat {struct Nat* ant;

}* Nat;

Nat Zero () {return NULL;

}Nat Succ (Nat a) {

Nat n = malloc (sizeof (Nat));n->ant = a;return n;

}Nat ant (Nat a) {

return a->ant;}

Definição da estrutura. Observe a recursão.

Função que define o Zero

Função que retorna o sucessor de um dado a.

Função que retorna o antecessor de um dado a.

Em C, ponteiros é o recurso que nos permite definir tipos recursivos

Numeros Naturais

Page 58: Recursividade

Se b é o número 1, então a + b é definido como sucessor de a. Por outro lado, se b fosse 2, a + b seria definido como sucessor de a + 1. Ou seja, a + c é o sucessor de a + b, onde b é o antecessor de c. Isso pode ser descrito na seguinte função:

Nat sum (Nat a, Nat c) { if (c == Zero () )

return a; else { return Succ ( sum (a, ant(c)));

}}

Numeros Naturais

Page 59: Recursividade

A multiplicação pode ser definida em termos de soma sucessivas.

Nat mult (Nat a, Nat b) {if (a == Zero () )

return Zero ();else

return sum (b, (mult (b, ant(a))));}

Numeros Naturais

Page 60: Recursividade

A multiplicação pode ser definida em termos de soma sucessivas.

Nat mult (Nat a, Nat b) {if (a == Zero () )

return Zero ();else

return sum (b, (mult (b, ant(a))));}

Numeros Naturais

Baixem e testem o código.

Page 61: Recursividade

Atividade

1. Codifiquem a divisão inteira.2. Codifiquem a função que retorna o resto de uma divisão inteira, ou seja, equivalente ao operador %.