有一对兔子,他们每一个月生一对小兔子,新生的小兔子两个月就长大了,在第二个月的月底就开始生他们的下一代小兔子,这样一代一代生下去。求解兔子增长的数量的数列。
问题可以抽象成下列数学公式:Un = Un-1 + Un-2
其中:n是项数(n>=3)。它就是著名的斐波那契数列,该数列的前几项为:1,1,2,3,5,8,13,21,...
递归函数:把直接调用自己的函数称为递归函数。递归调用会产生大量的函数副本,会耗费大量的时间和内存。
每个递归定义必须至少有一个条件,满足递归不再进行,即退出递归。
代码 C:
#include <stdio.h>
#include <stdlib.h>
int fibonacci(int i)
{
if (i <= 2)
return i == 0 ? 0 : 1;//满足递归结束的条件
return fibonacci(i - 1) + fibonacci(i - 2);
}
int main(void)
{
int i;
for (i = 1; i <= 12; i++)
printf("经过%d次之后的数量:%d\n", i, fibonacci(i));
system("pause");
return 0;
}
通过递归可想而知,其中有很多重复的计算,如果能把计算过的值,通过一个数组记录下来,下次递归的时候,能在数组中直接拿到的话,那么可以大大
减少的递归的次数。
#include <iostream>
int fibonacci(int i, int* arr){
if (arr[i] != -1){
return arr[i];
}
else{
arr[i] = fibonacci(i - 1, arr) + fibonacci(i - 2, arr);
}
return arr[i];
}
int main(){
int arr[20] = {};
memset(arr, -1, sizeof(arr));
arr[0] = 1;
arr[1] = 1;
for (int i = 0; i < 20; i++){
printf("经过%d次之后的数量:%d\n", i, fibonacci(i, arr));
}
system("pause");
return 0;
}
#include <iostream>
int main(){
int arr[20] = {};
memset(arr, -1, sizeof(arr));
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i < 20; i++){
arr[i] = arr[i - 1] + arr[i - 2];
printf("经过%d次之后的数量:%d\n", i, arr[i]);
}
system("pause");
return 0;
}
编译环境:VS2013 + win7