Questo è infatti strettamente legato alla Fibonacci sequence, come menzionato solo brevemente in uno dei commenti finora: Ogni passo n
può essere raggiunta da entrambi i due passaggi seguenti (n-2
) o un gradino sotto (n-1
), così il numero di possibilità per raggiungere quel passo è la somma delle possibilità di raggiungere quegli altri due passaggi. Infine, c'è esattamente una possibilità per raggiungere il primo passo (e lo zeroth, cioè stare a terra).
Inoltre, poiché il numero di possibilità per passo n
dipende solo i risultati per passo n-1
e n-2
, non è necessario memorizzare tutti i valori intermedi in una mappa o in un array - le ultime due sono abbastanza!
public static long possForStep(int n) {
// current and last value, initially for n = 0 and n = 1
long cur = 1, last = 1;
for (int i = 1; i < n; i++) {
// for each step, add the last two values and update cur and last
long tmp = cur;
cur = cur + last;
last = tmp;
}
return cur;
}
Questo non solo riduce la quantità di codice da una buona azione, ma anche dà una complessità di O (n) nel tempo e O (1) nello spazio, al contrario di O (n) nel tempo e spazio quando si memorizzano tutti i valori intermedi.
Tuttavia, dal momento che anche il tipo long
rapidamente troppo pieno come n
si avvicina al 100 in ogni caso, lo spazio complessità O (n) non è davvero un problema, in modo da poter altrettanto bene andare con questa soluzione, che è molto più facile leggere.
public static long possForStep(int n) {
long[] values = new long[n+1];
for (int i = 0; i <= n; i++) {
// 1 for n==0 and n==1, else values[i-1] + values[i-2];
values[i] = (i <= 1) ? 1 : values[i-1] + values[i-2];
}
return values[n];
}
Aggiornamento: noti che questo si trova vicino a, ma non proprio la stessa come la sequenza Fibonacci, che inizia 0, 1, 1, 2, 3,...
mentre questo va 1, 1, 2, 3, 5, ...
, cioè possForStep(n) == fibonacci(n+1)
.
possibile duplicato di [Trovare tutti i percorsi giù per le scale?] (http://stackoverflow.com/questions/5099337/finding-al l-path-down-stairs) –