2017-09-17 22:41:44
递归
____函数自己调用自己,又可以理解为自己的事情自己做。
如果觉得难以理解,可以把理解成这个函数调用了一个函数,只是这个函数和自己长得一模一样。
---------------------------------------------------------------------------------------
拿一对刚出生的小兔子编故事。
假设,一对刚出生的小兔子,第一个月没有繁殖能力,两个月后生下一对兔子。
假设所有的兔子都不死,那么10月后有多少对兔子?
所经历的月数 1 2 3 4 5 6 7 8 9 10
兔子对数 1 1 2 3 5 8 13 21 34 55
---------------------------------------------------------------------------------------
很明显,相邻两项之和 构成了后一项。
#include <stdio.h> int FBArray(int i) {//FBArray(1) FBArray(2) FBArray(3) FBArray(4) FBArray(5) // 1 1 2 3 5 if(i < 2) { return (i == 0)? 0 : 1; } return FBArray(i-1) + FBArray(i-2); } int main() { printf(" "); int i; for(i = 1 ; i <= 40 ; i++) {//打印40个月兔子的数量变化 printf("%d ",FBArray(i)); } printf(" "); return 0; }
如果考虑算法复杂度的的话,还是以下代码更优
//斐波那契数列查找算法,求斐波那契数列第n项 #include<stdio.h> unsigned long long FBArray(unsigned int n); int main(void) { int n; scanf("%d" , &n); printf("%llu " , FBArray(n)); return 0; } unsigned long long FBArray(unsigned int n) { int i , fibone , fibtwo , fibthree; int fi[2] = {0 , 1}; fibone = 0; fibtwo = 1; if(n < 2) { return fi[n]; } else { for(i = 2;i <= n;i++) { fibthree = fibone + fibtwo; fibtwo = fibone; fibone = fibthree; } return fibthree; } }