斐波那契递归算法

来源:互联网 发布:水溶性颜料淘宝 编辑:程序博客网 时间:2024/06/05 17:22

递归--以空间换时间


首先斐波那契数列的一种定义为


利用这个定义,我们可以利用分治法递归解决它。


只要求矩阵 的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;}


0 0
原创粉丝点击