斐波那契递归算法
遞歸--以空間換時間
首先斐波那契數列的一種定義為
利用這個定義,我們可以利用分治法遞歸解決它。
只要求矩陣?的n次方。
分治法思想就是 , 求矩陣a的n/2次方,然后再相乘,求得a(n為奇數時候需要特殊處理)
代碼如下,很簡潔的遞歸。
#include <stdio.h> #include <string.h> void fn(int a[][2] , int n){//計算方陣a的n次方if (n>1){fn(a,n/2);//計算方陣a的n/2次方,存入a中int temp[2][2];memset(temp,0,sizeof(temp));for (int i = 0 ; i < 2 ; i ++)for (int j = 0 ; j < 2 ; j ++){for (int k = 0 ;k <2 ;k++)temp[i][j]=(a[i][k]*a[k][j]+temp[i][j])%10000;}if (n%2==1){a[0][0] = (temp[0][0]+temp[0][1])%10000;a[0][1] = (temp[0][0])%10000;a[1][0] = (temp[1][0]+temp[1][1])%10000;a[1][1] = (temp[1][0])%10000;}else{for (int i = 0 ; i < 2 ; i ++)for (int j = 0 ; j < 2 ; j ++){a[i][j] =temp[i][j];}}} }int main(){int n ;while (~scanf("%d",&n)&&n!=-1){if (!n){printf("0\n");}else{int a[2][2] = {1,1,1,0};fn(a,n);printf("%d\n",a[0][1]);}}return 0; }總結
- 上一篇: Android开发:5-2、ListVi
- 下一篇: 直接插入排序(内部排序)