Implementazione algoritmo fibonacci
ho dei problemi nell'implementazione di questo algoritmo per risolvere i numeri di fibonacci
vi posto lo pseudocodice e il codice
ecco qui il codice sviluppato da me invece
lo pseudocodice l'ho preso invece dal libro,quindi è esatto, ma avrò sbagliato qualcosa nell'implementazione che non capisco
vi posto lo pseudocodice e il codice
algoritmo fibonacci(intero n)->intero M<-(1 0) (0 1) potenzadimatrice(M,n-1) return M[0][0] procedura potenzadimatrice(matrice M,intero n) if(n>1)then potenzadimatrice(M,n/2) M<-M*M if(n è dispari) then M<-M*(1 1) (1 0)
ecco qui il codice sviluppato da me invece
lo pseudocodice l'ho preso invece dal libro,quindi è esatto, ma avrò sbagliato qualcosa nell'implementazione che non capisco
#include<iostream> using namespace std; const int DIM=2; int A[DIM][DIM]={{1,1},{1,0}}; void potenzaDiMatrice(int M[DIM][DIM],int n) { if(n>1) potenzaDiMatrice(M,n/2); { int i,j,k; int somma; for(i=0;i<2;i++) for(j=0;j<2;j++){ somma=0; for(k=0;k<2;k++) somma+=M[i][k]*M[k][j]; M[i][j]=somma; } } if(n%2!=0) { int I[DIM][DIM]={{1,1},{1,0}}; int i,j,k; int somma; for(i=0;i<2;i++) for(j=0;j<2;j++){ somma=0; for(k=0;k<2;k++) somma+=M[i][k]*I[k][j]; M[i][j]=somma; } } } int fibonacci(int n) { int M[DIM][DIM]={{1,0},{0,1}}; potenzaDiMatrice(M,n-1); return M[0][0]; } int main() { int num=0; cout<<"Inserisci un numero maggiore di 0 : "; cin>>num; cout<<fibonacci(num); return 0; }
Risposte
La matrice A non l'hai più usata e penso che mettere una variabile per memorizzare 2 che è evidentemente una costante che non cambia mai sia inutile. E poi ci metti meno a scrivere 2 che a scrivere DIM... Poi fai come vuoi tu. Al massimo cambiano gli elementi delle matrice ma certo non la sua dimensione.
Comunque semplicemente la matrice M è sbagliata, doveva essere come A. Per esempio vedi qui http://mathworld.wolfram.com/FibonacciQ-Matrix.html
Detto questo la funzione di elevamento a potenza la puoi vedere qui http://en.wikipedia.org/wiki/Exponentiation_by_squaring (il primo), qui http://en.wikipedia.org/wiki/Modular_exponentiation oppure anche su Knuth. Non ho controllato se il tuo è corretto. A mio avviso però è meglio se dividi l'implementazione della moltiplicazione matriciale da quella di calcolo della potenza ennesima. Detto questo Io personalmente memorizzerei la matrice con un più semplice array di 4 elementi.
Comunque semplicemente la matrice M è sbagliata, doveva essere come A. Per esempio vedi qui http://mathworld.wolfram.com/FibonacciQ-Matrix.html
Detto questo la funzione di elevamento a potenza la puoi vedere qui http://en.wikipedia.org/wiki/Exponentiation_by_squaring (il primo), qui http://en.wikipedia.org/wiki/Modular_exponentiation oppure anche su Knuth. Non ho controllato se il tuo è corretto. A mio avviso però è meglio se dividi l'implementazione della moltiplicazione matriciale da quella di calcolo della potenza ennesima. Detto questo Io personalmente memorizzerei la matrice con un più semplice array di 4 elementi.