Il problema più grande della serie Fibonacci è la complessità temporale dell'algoritmo, quando si utilizza la ricorsione semplice, si ricreerà tutto e si eseguirà un doppio lavoro. Questo perché quando si calcola fib (n) utilizzando
int fib(int n) {
if (n < 2) { return 1; }
return fib(n-1) + fib(n-2)
}
sarete calcolando fib (n-1), che calcola fib (n-2) e fib (n-3). Ma per il calcolo di fib (n), si calcolerà già fib (n-2). Per migliorare questo, è necessario memorizzare i risultati temporanei. Questo di solito è più semplice usando l'iterazione e partendo da i = 0 fino a n. In questo modo è possibile memorizzare facilmente gli ultimi due risultati ed evitare di calcolare gli stessi valori più e più volte.
Un modo semplice per vedere se un algoritmo è efficiente è cercare di risolverlo per alcuni esempi sempre più difficili. Puoi anche calcolarlo in modo più accurato. Prendi l'esempio di Fibonacci sopra. Chiamare fib (n) richiederebbe la complessità O(fib(n)) = O(fib(n-1)) +O(fib(n-2)) + 1
(prendiamo solo 1 per l'aggiunta).Supponiamo che O(fib(0)) = O(fib(1)) = 1
. Questo significa O(fib(2)) = 3, O(fib((3)) = 5, O(fib(4)) = 9
. Come puoi vedere, questa serie salirà più in fretta della stessa serie di Fibonacci! Ciò significa una quantità enorme di complessità crescente. Quando avresti un algoritmo iterativo con un ciclo for da 0 a n, la tua complessità scalerebbe nell'ordine di n, che sarebbe molto meglio.
Per ulteriori informazioni, consultare la notazione grande.
Se si utilizza ints o long non si andrà molto oltre 60 o 70 ricorsioni quindi non importa. E potresti anche memorizzare i risultati nella cache con il metodo ricorsivo. – assylias
Inoltre: [ricorsione-o-loop?] (Http://stackoverflow.com/questions/13346424/recursion-or-looping?lq=1) – nawfal