La modifica al programma fibonacci
funziona effettivamente per calcolare le somme. Tuttavia, il modo in cui hai usato la ricorsione è inefficiente. Un modo per affrontarlo è con un approccio di "programmazione dinamica", in cui i valori calcolati vengono memorizzati nella cache in modo che possano essere riutilizzati dalla seconda chiamata ricorsiva.Tuttavia, il n-esimo numero di Fibonacci può essere calcolato in avanti dalla base. Un'implementazione ricorsiva di questo sarebbe:
public static int fib_r (int a, int b, int n) {
if (n == 1) return a;
if (n == 2) return b;
return fib_r(b, a+b, n-1);
}
public static int fib (int n) {
return fib_r(0, 1, (n > 0) ? n : 1);
}
Il codice corrispondente per la somma sarebbe:
public static int sumfib_r (int a, int b, int n) {
if (n == 1) return a;
if (n == 2) return b;
return sumfib_r(b, a+b+1, n-1);
}
public static int sumfib (int n) {
return sumfib_r(0, 1, (n > 0) ? n : 1);
}
coda ricorsione sarà spesso modificato dal compilatore/interprete in un semplice ciclo come parte di tail call rimozione.
ti ha chiesto:
io ancora non riuscivo a capire come la somma della serie funziona se aggiungo 1. Qualcuno può spiegare ??
Questa domanda riguarda davvero la comprensione dell'algoritmo, che suppongo sia di attualità su SO. Ma è richiesta la matematica per descrivere perché l'algoritmo funziona. Quindi, questa è davvero una domanda di matematica. C'è un well known theorem regarding the sum of Fibonacci numbers. Se F[i]
è il numero di Fibonacci i-esimo, e S[n]
è la somma dei primi n
numeri di Fibonacci, poi il teorema afferma sopra:
S[n] = F[n+2] - 1
Quindi, se si considera che per definizione di S[n+2]
,
S[n+2] = S[n+1] + F[n+2]
Poi, sostituendo S[n] + 1
per F[n+2]
:
S[n+2] = S[n+1] + S[n] + 1
che si dovrebbero riconosce è la tua funzione "aggiungi 1 modificato" fibonacci
.
Di seguito è una prova per induzione che il tuo programma calcola la somma che ho fornito nella mia risposta originale. Lascia che F
rappresenti la tua funzione fibonacci
e che sia S
la funzione "aggiungi 1 modificato" fibonacci
.
F[1] = 0
F[2] = 1
F[i] = F[i-1] + F[i-2] for i > 1
S[1] = 0
S[2] = 1
S[i] = S[i-1] + S[i-2] + 1 for i > 1
Quindi, si vuole una prova che per k > 0
:
k
.---
S[k] = > F[i]
`---
i = 1
Si noti che quanto sopra sommatoria è vero se e solo se:
S[1] = F[1]
S[k] = F[k] + S[k-1] for k > 1
La prova è abbastanza semplice. I casi base sono banalmente veri.
S[1] = F[1] = 0
S[2] = F[2] + F[1] = 1
S[3] = S[2] + S[1] + 1 = F[3] + F[2] + F[1] = 2
Il passo induzione è: Dato che per alcuni k > 2
, S[j+1] = F[j+1] + S[j]
per 0 < j < k+1
, dimostrano che l'uguaglianza vale se j = k+1
, cioè: S[k+2] = F[k+2] + S[k+1]
.
S[k+2] = S[k+1] + S[k] + 1
=> S[k+2] = (F[k+1] + S[k]) + (F[k] + S[k-1]) + 1
=> S[k+2] = (F[k+1] + F[k]) + (S[k] + S[k-1] + 1)
=> S[k+2] = F[k+2] + S[k+1]
Questo completa la prova.
se n = 5 il risultato dovrebbe essere 11, non 7. (1 + 2 + 3 + 5 = 11). Cosa vuoi calcolare esattamente? – niculare
Inizio da 0 non 1 ... quindi 0 + 1 + 1 + 2 + 3 ... – Learner
Funziona per il numero successivo della serie? In caso contrario, l'algoritmo è sbagliato. –