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.
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 depoisc)algoritmo(4)=algoritmo(3)+(...)// Sempre a mesma coisad)algoritmo(3)=algoritmo(2)+(...)// Sempre a mesma coisae)algoritmo(2)=2// Esse eu já sei o valor, pode voltar para d) e continuard)algoritmo(3)=2+3*algoritmo(1)// Agora tenho de saber o algoritmo de 1f)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
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
guialeixo
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.
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
regissl
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
guialeixo
editei meu post pois havia erro
R
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é
Obrigado.
Att,
Regis
G
guialeixo
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é
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é
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”.
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…