Não entendi a Recursão

16 respostas
R

Pessoal, olhem a recursão abaixo, alguém poderia me explicar passo a passo o que ele faz?
Realmetne não consegui entender pq a saída é 116. Parece que ele só diminui de um lado na hora de chamar a função novamente e depois vai diminuir o outro lado.
Se alguém puder explicar agradeço.

public class teste {

	public static void main(String args[]) {
		System.out.println("teste");
		teste test = new teste();
		int t = test.algoritmo(6);
		System.out.println("n vale: " + t);
	}

	public int algoritmo(int N) {
		System.out.println("N vale: " +  N);
		if (N == 1 || N == 2) {
			return N;
		} else {
			return algoritmo(N-1) + N * algoritmo(N-2);
		}
	}

}

16 Respostas

C

Fica bem dificil explicar o que acontece ai no seu código, aconselho vc a usar o debugger ou fazer um teste no papel.

Vai ajudar bastante a entender o código.

davidbuzatto

Mas é isso mesmo que acontece.
A recursão é feita à esquerda primeiro. Quando a chamada recursiva à esquerda terminar (quando N for igual a 1 ou 2), ai sim começará a chamada à direita.

Faça um teste de mesa, dividindo cada passo da recursão.

[]´s

marcelo.bellissimo

Não adianta tentar “explicar” o que ele faz… só fazendo o teste de mesa mesmo… sabe fazer um teste de mesa? É bem simples, meio trabalhoso, mas simples… Daí você vai entender o resultado, apesar de eu não saber pra que serve esse algoritmo, alguém lembra o que é isso aí?

E você tem dúvidas quanto á recursividade, como ela funciona?

pmlm

Vamos ver se eu consigo explicar “graficamente”

a) algoritmo (6) = algoritmo (5) + (...) // Não interessa o que vem depois porque tenho de calcular primeiro o algoritmo(5)
b) algoritmo (5) = algoritmo (4) + (...) // Da mesma forma não interessa o que vem depois
c) algoritmo (4) = algoritmo (3) + (...) // Sempre a mesma coisa
d) algoritmo (3) = algoritmo (2) + (...) // Sempre a mesma coisa
e) algoritmo (2) = 2 // Esse eu já sei o valor, pode voltar para d) e continuar
d) algoritmo (3) = 2 + 3 * algoritmo(1) // Agora tenho de saber o algoritmo de 1
f) algoritmo (1) = 1 //tem a reposta para o 1, continua d)
d) algoritmo(3) = 2 + 3 = 5 // tenho algoritmo(3), posso continuar c)
c) algoritmo (4) = 5 + 4 * algoritmo (2) // tenho de saber o algoritmo de 2 (é 'burro' e não sabe que já calculou)
g) algoritmo (2) = 2 
(...) // and so on and so on
G

cara ja respondi esse topico

http://www.guj.com.br/posts/list/215191.java

R

Eu não entendi o seguinte, ele começa no 6 e da um return(N - 1) e N então vale 5, depois 4, 3, e quando chega no 2 ele dá um return na função então ele não acessa o 1. Portanto, tem-se o 6,5,4,3,2 empilhados. Agora ele vai para o algoritmo(N - 2) mas qual o valor de N? Ele guardou o 6 de antes pra fazer a mesma coisa que fez no algoritmo(N-1) anterior? e quando ele faz a soma e a multiplicação?

Me desculpem mas eu já tinha lido o outro tópico e não entendi, e novamente não consegui entender essa recursão.

Se alguém puder detalhar melhor eu agradeço.

Obrigado de qualquer forma.

Att,
Regis

G

Acho que é isso ai mesmo. olha F(6) = F(5) + 6F(4) ou seja se F(5) = F(4) + 5F(3) Dai o F(4) =F(3) + 4F(2) e F(3)= F(2) + 3F(1) dai quando chega função de F(2) E F(1) fica irredutivel.

edit: meu fluxo tava errado crtl +c ctrl+v da sempre errado +) da uma olhada ai que você vai conseguir tenho certeza
faz no papel msm cara.

F(6)
****
n=6
F(5) + 6*F(4)  
*********************
F(5)
****
n=5
F(4) + 5*F(3)
**********************
F(4)
****
n=4
F(3) + 4*F(2)
**********************
F(3)
****
n=3
F(2) + 3*F(1)
**********************
F(2)
****
n=2
2
**********************
F(1)
****
n=1
1
**********************************************************************
F(3) + 4*F(2)
(F(2) + 3*F(1) )+ 4*F(2)
(2 + 3*1) + 4*2
13
marcelo.bellissimo

regissl:
Eu não entendi o seguinte, ele começa no 6 e da um return(N - 1) e N então vale 5, depois 4, 3, e quando chega no 2 ele dá um return na função então ele não acessa o 1. Portanto, tem-se o 6,5,4,3,2 empilhados. Agora ele vai para o algoritmo(N - 2) mas qual o valor de N? Ele guardou o 6 de antes pra fazer a mesma coisa que fez no algoritmo(N-1) anterior? e quando ele faz a soma e a multiplicação?

Me desculpem mas eu já tinha lido o outro tópico e não entendi, e novamente não consegui entender essa recursão.

Se alguém puder detalhar melhor eu agradeço.

Obrigado de qualquer forma.

Att,
Regis

Só com teste de mesa… não tem outra solução, explicação, magia, ou qualquer outro tipo de coisa que vá te ajudar á entender melhor do que um teste de mesa… abre uma planilha do Excel, faça as colunas pra ir marcando os valores, e pra cada passo faça uma linha nova com os valores, só assim você vai entender…

R

O que eu não estou entendendo é o fluxo.
Primeiro ele chama o return algoritmo(N-1) até encontrar o 2, depois o N volta a ser 6 (como?) e chama N * algoritmo(N-2) passando N-2 ou seja 4, depois 2 e cai fora porque eh 2.

No fim do processo temos 5 + 6 * 4, 4 + 5 * 2…

Já calculei e não da certo, enfim o fluxo dele está estranho pra mim.

Obrigado novamente pela ajuda de vcs.

Att,
Regis

G

editei meu post pois havia erro

R

guialeixo agora entendi o seu raciocínio. No entanto, ainda continuo sem entender o fluxo. O que é empilhado primeiro, quem afinal dos dois esta chamando a função, os dois ao mesmo tempo?

Esse fluxo não to conseguindo entender.

Agora entendo porque minha professora dizia que recursão era uma questão de fé :confused:

Obrigado.

Att,
Regis

G

regissl:
guialeixo agora entendi o seu raciocínio. No entanto, ainda continuo sem entender o fluxo. O que é empilhado primeiro, quem afinal dos dois esta chamando a função, os dois ao mesmo tempo?

Esse fluxo não to conseguindo entender.

Agora entendo porque minha professora dizia que recursão era uma questão de fé :confused:

Obrigado.

Att,
Regis

Cara num é questão de fé nao. é questao de logica você so precisa parar de pensar no codigo e pegar a logica do negocio, pensa o seguinte se é n = 6 logo a F(6) = F(6-1) 6 * (F6-2) => F(5) 6*(F4) => F(F(5-1) 5 * F(5-2)) 6 * F(F(4-1) 4*F(4-2)) => … agora continue

davidbuzatto

regissl:
guialeixo agora entendi o seu raciocínio. No entanto, ainda continuo sem entender o fluxo. O que é empilhado primeiro, quem afinal dos dois esta chamando a função, os dois ao mesmo tempo?

Esse fluxo não to conseguindo entender.

Agora entendo porque minha professora dizia que recursão era uma questão de fé :confused:

Obrigado.

Att,
Regis

Então sua professora deveria tomar vergonha na cara dela. Falar que é questão de fé é pq nem ela entende.
Uma forma fácil de entender a recursão seria vc construir (na mão mesmo) uma árvore.

Veja a execução do método recursivo para o valor 6 que você deu o exemplo. Note que usei “alg” como nome da função.
Tem duas imagens em anexo. A primeira é a árvore, a segunda é o caminho que é executado.
Note que o caminho executado pela sua funlçao é um caminho “em ordem”.

[]´s




R

David,
muito obrigado.

Agora sim entendi perfeitamente.

Obrigadão.

Att,
Regis

marcelo.bellissimo

Entenda bem isso ai, é bom pra você entender o conceito de pilha… já ouviu falar num erro chamado stackOverflow? Pega esse exemplo, e tenta entender porque ele acontece… ou poderia acontecer nesse caso da recursão…

davidbuzatto

regissl:
David,
muito obrigado.

Agora sim entendi perfeitamente.

Obrigadão.

Att,
Regis

De nada Regis :wink:

[]´s

Criado 23 de agosto de 2010
Ultima resposta 24 de ago. de 2010
Respostas 16
Participantes 6