斐波那契数列:1 1 2 3 5 8 13 21……(第三项是前两项之和)
生兔子问题:一对兔子,第三个月,能够再生一对兔子。假设每次都是生的一对(一公一母),并且兔子不会死。请问第n个月一共有几对兔子
//递归
#include<stdio.h>
#include<stdlib.h>
int count = 0;
int Fib(int n){
if (n == 1 || n == 2){
return 1;
}
if (n == 3){
count++;
}
return Fib(n - 1) + Fib(n - 2);
}
int main(){
printf("%d\n", Fib(5));
printf("%d\n", count);
system("pause");
return 0;
}
//非递归
#include<stdio.h>
#include<stdlib.h>
int Fib(int n){
if (n == 1 || n == 2){
return 1;
}
int last1 = 1;//第n-1项
int last2 = 1;//第n-2项
int cur = 0;//第i项
for (int i = 3; i <= n; i++){
cur = last1 + last2;
last2 = last1;
last1 = cur;
}
return cur;
}
int main(){
printf("%d\n", Fib(5));
system("pause");
return 0;
}
在这个问题中,我们清楚的看出使用递归比循环耗费了更长的时间,所以总结如下:
通常情况下,解决同一个问题,使用循环的时间低于使用递归的时间,使用循环的空间开销要低于递归的空间开销!
因为函数调用是有开销的。