基本规则介绍
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
这里引用别人的图,如有侵权,可以联系我,立马删!
小细节;一般大数相乘会用1e9+7(10000000007)去余 用于保存。???个人也不太懂。
基本思路
类类斐波那契数列解法
此类求多少种可能性 的题目一般都有递推性质 ,即 f(n)和 f(n-1)…f(1)之间是有联系的。
我们可以先画5个台阶来推出其可能的性质,从图中的可以观察出?处应该是8=3+5,第n项解法的数量是前一项+前2项的解法数量。
类斐波那契数列:0 1 1 2 3 5 8 ...... 其规律是n>=2 ,f(n)=f(n-1)+f(n-2)
1.递归解法(反向)
求第n个台阶的跳法总能化为求n-1,n-2的跳法之和。求n-1的跳法又能化成求n-2,n-3的跳法之和。n-2也是如此。最后可以推到求n=1,2时的跳法之和的问题。下面是代码体现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
int fei(n)
{
int a=0;
if (n == 1)
{
a = 1;
return a;
}
else if (n == 2)
{
a = 2;
return a;
}
else
{
a = fei(n - 1) + fei(n - 2);
}
return a;
}
int main()
{
int n,z;
scanf("%d", &n);
z = fei(n);
printf("%d", z);
return 0;
}
特点
其代码是反向运算,从n得到了n=1,n=2的值时候函数才返回去运算3,4....n的值。其中有大量的重复运算。n值大的时候运算,并不能一下子出结果,其计算次数是很大的,需要一定时间。
2.迭代解法(正向)
用斐波那契数列正向解开,f(n+1)=f(n)+f(n-1)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int a, b, sum, n;
a = 0;
b = 1;
sum = 0;
scanf("%d", &n);
while (n--)
{
sum = a + b;
a = b;
b = sum;
}
printf("%d", sum);
return 0;
}
重要思路 得从第一项开始做 用第n-1项代换第n项 第n项换n+1项。
如果是用n=1 2 3来开始做起始项,会导致很难用if判断何时该输出什么值。