Eu estava resolvendo um teste em uma plataforma online e o problema era parecido com este.
Stuart tem que ir de um lugar para outro (A-> B) e ele pode pular 1 passo, 2 passos ou 3 passos de cada vez. Pode haver n número de paradas entre A e B.
Precisamos descobrir quantas maneiras ele pode fazer isso.
Eu sinto que isso é similar ao problema clássico de subir escadas com pouca diferença de que lá você finalmente tinha que chegar ao n-ésimo degrau, enquanto neste problema em particular você tem que descer, o que faz provavelmente n+1 degrau. Estou certo?
Então o código que escrevi é este:
function countWays(n) {
if (n < 0) return 0;
if (n === 0) return 1;
if (n === 1) return 2; //If you have one stop-over, there's two ways to reach. One is take one jump and then one more. Second is take two jumps at once and reach the destination
return countWays(n-1) + countWays(n-2) + countWays(n-3);
}
console.log(countWays(4))
Isso não foi aceito. Então, estou apenas me perguntando o que há de errado nisso. Eu deveria ter adicionado base case para n==2
também?
if (n === 2) return 4
Isso ainda não adianta nada, pois n = 3
retornaria 6
, enquanto visualmente posso ver que haveria 7 maneiras se houvesse 3 paradas.
Outra pergunta que quero fazer é:
No caso clássico de escada, o caso base para n === 0
seria 1. Ainda seria o mesmo aqui? Isso me confunde um pouco, pois quando não há mais degraus para subir, como o resultado pode ser 1. Por outro lado, aqui, quando n === 1
você ainda tem um caminho que deve seguir para chegar ao destino.
Além disso, f(3)
a lógica e a intuição dizem que deveria ser:
number of ways to reach first stopover + f(2)
E number of ways to reach first stopover
seria apenas um, já que só há uma maneira de fazer isso (dando um salto).
No entanto, não posso colocar if(n == 1) return 1
no caso base, pois seria incorreto. Digamos que há apenas uma parada (n = 1), na verdade há duas maneiras de chegar:
- Pular 2 passos
- Pule 1 passo e depois mais um.
Então isso também está criando um pouco de confusão.