写正确函数需要注意的地方:快速返回斐波那契数的第n项
2012-08-20 17:12
281 查看
void f(int n, int* a) { static int A[4]={1,1,1,0}; if(n==1) return; f(n/2,a);//计算一半矩阵乘法的结果 int temp[4]; for(int i=0;i<4;i++) temp[i]=a[i]; for(int i=0;i<2;++i)//获得n/2*2的结果 { for(int j=0;j<2;++j) { a[2*i+j]=0; for(int k=0;k<2;++k) a[2*i+j]+=temp[2*i+k]*temp[2*k+j]; } } if(n%2!=0)//获得n/2*2+1的结果 { int temp[4]; for(int i=0;i<4;i++) temp[i]=a[i]; for(int i=0;i<2;++i) { for(int j=0;j<2;++j) { a[2*i+j]=0; for(int k=0;k<2;++k) a[2*i+j]+=temp[2*i+k]*A[2*k+j]; } } } } int fib(int n) { if(n<1)//参数正确性检查 return -1; if(n==1 || n==2) return 1; else { int a[4]={1,1,1,0}; f(n-2,a); return fib(2)*a[0]+fib(1)*a[2]; } }
相关文章推荐
- 写正确函数需要注意的地方:快速排序
- 写正确函数需要注意的地方:在字符串中找出连续最长的数字串,并把这个串的长度返回
- 写正确函数需要注意的地方:奇偶数分开,左边偶数,右边奇数。
- 写正确函数需要注意的地方:int转char*, char* 转int。
- 写正确函数需要注意的地方:两个有序链表的合并
- 写正确函数需要注意的地方:链表的合并排序
- 写正确函数需要注意的地方:输入一个字符串,打印出该字符串中字符的所有排列
- 写正确函数需要注意的地方:链表的逆转,递归与非递归
- 写正确函数需要注意的地方:二叉树非递归中序遍历
- 写正确函数需要注意的地方:最长递减子序列
- 写正确函数需要注意的地方:输入两个整数n和m,从数列1,2,3,...n中随意取几个数,使其和为m,列出所有可能组合
- 写正确函数需要注意的地方:两个序列a,b,大小都为n,序列元素的值为任意整数,无序;要求通过交换a,b中的元素,使序列a元素的和与序列b元素的和之间的差最小
- 写正确函数需要注意的地方:strstr
- 写正确函数需要注意的地方:最大堆的创建与堆排序
- 写正确函数需要注意的地方:二分查找
- 写正确函数需要注意的地方:翻转句子中单词的顺序。
- 写正确函数需要注意的地方:子数组的最大和
- 写正确函数需要注意的地方:两个非降序链表的并集,1>2>3和2>3>5合并为1>2>3>5。
- 写正确函数需要注意的地方:链表的及时终止冒泡排序
- 写正确函数需要注意的地方:给定一个十进制整数N,计算从1开始到N的所有整数出现的“1”的个数