Duvida sobre recursividade
Pessoal, pesquisei bastante e ainda estou pesquisando por ai sobre essas duas duvidas. Estou estudando pelo livro JavaScript Eloquent - uma moderna introdução ao JavaScript. Ainda sou iniciante e quando chegou na parte de recursividade fiquei com algumas duvidas.
1º - duvida: Sabendo que uma pilha de chamadas agrupa as funções por ordem de chamada, e depois desfaz delas também por ordem. Quando usamos recursividade, é criado uma nova função, tipo uma copia da função anterior, ou a mesma função é alterada com os novos valores dos parâmetros? Para esclarecer: Estou modificando a mesma função ou os valores da função que estou retornando são novos valores?
2º - Fiquei com essa duvida depois de ver esse código que me deixou pensando por horas:
Considere este quebra-cabeça: iniciando com o número 1 e repetidamente adicionando 5 ou multiplicando por 3, uma infinita quantidade de novos números pode ser produzida. Como você implementaria uma função que, dado um número, tenta achar a sequência de adições e multiplicações que produzem esse número? Por exemplo, o número 13 pode ser produzido multiplicando-se por 3 e adicionando-se 5 duas vezes. Já o número 15 não pode ser produzido de nenhuma forma.
function findSolution(target){
function find(start,history){
if (start == target)
return history;
else if (start>target)
return null;
else
return find(start + 5, "("+ history+"+5)") || find(start *3, "("+history+"*3)");
}
return find(1,"1");
}
console.log(findSolution(24));
O resultado é esse: (((13)+5)3)
Fiquei com duvida porque quando chega em um determinado momento da repetição, em que não tem como o primeiro valor de find(start+"("+history+"+5) dar o resultado correto, ele volta para o resultado da repetição anterior e começa a calcula novamente.
Estou com um nó na cabeça. Vou colocar a parte do livro aqui para vocês darem uma olhada:
Para entender melhor como essa função produz o resultado que estamos esperando, vamos analisar todas as chamadas a find que são feitas quando procuramos a solução para o número 13.
find(1, “1”) find(6, “(1 + 5)”) find(11, “((1 + 5) + 5)”) find(16, “(((1 + 5) + 5) + 5)”) too big find(33, “(((1 + 5) + 5) 3)”) //Minha duvida: Como ele volta para o valor 11 para calcular o 113 e dar 33??? too big find(18, “((1 + 5) 3)”) too big find(3, “(1 3)”) find(8, “((1 3) + 5)”) find(13, “(((1 3) + 5) + 5)”) found!Pessoal, me perdoem se saiu muito dificiu de entender. Estou desesperado. Será que não vou conseguir passar dessa linha? Estou pesquisando em tudo que é lugar.
OBS: Não estou fazendo curso, estudo sozinho com base nos livros.
Discussão (5)
Carregando comentários...