问题描述
一个台阶总共有n级,如果一次可以跳1级,也可以跳2级,求总共有多少种跳法
方法1-递归
通过枚举可以发现:台阶级数和跳法有如下关系
级数 0 1 2 3 4 5 6 7 8
跳法 0 1 2 3 5 8 13 21 35…
从这个规律来看,可以发现,从第三级开始,跳法是一个斐波拉契数列
递归代码
/**************************
Author:tmw
date:2017-11-23
**************************/
#include <stdio.h>
#include <stdlib.h>
int jump_stairs_fibonacci(int n)
{
int F[100];
F[0] = 0;F[1] = 1;F[2] = 2;
if(n<=2)
return F[n];
else
return jump_stairs_fibonacci(n-1) + jump_stairs_fibonacci(n-2);
}
测试代码及结果
int main()
{
printf("测试代码!\n");
int n1,n2,n3,res1,res2,res3;
n1=5;
res1 = jump_stairs_fibonacci(n1);
printf("跳%d个台阶共有%d种跳法\n",n1,res1);
n2=10;
res2 = jump_stairs_fibonacci(n2);
printf("跳%d个台阶共有%d种跳法\n",n2,res2);
n3=45;
res3 = jump_stairs_fibonacci(n3);
printf("跳%d个台阶共有%d种跳法\n",n3,res3);
return 0;
}
方法2-递推
同样是斐波拉契数列,采用递归会发现,越到递归的后面,它的重复计算很多,时间花费比较大,因此采用递推,每个位置的值只需算一次,大大节省了时间。
递推代码
#include <stdio.h>
#include <stdlib.h>
int jump_stairs_fibonacci_recursive(int n)
{
int a[3] = {0,1,2};//规律之外的额外列出
if(n<3)
return a[n];
int i;
int front_1 = 1;//当前所求值的前两位
int front_2 = 2;//当前所求值的前一位
int current;//当前所求值
for(i=2;i<n;i++)
{
current = front_1+front_2;
front_1=front_2;//更新front_1,相当于游标下移
front_2=current;//更新front_2,相当于游标下移
}
return current;
}
递推代码测试结果
从运行时间上可以看出,递推法比递归法用时少的多。
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙