递归–以空间换时间
首先斐波那契数列的一种定义为
利用这个定义,我们可以利用分治法递归解决它。
只要求矩阵 的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;
}