递推——斐波那契数列应用 | HDU - 2044 一只小蜜蜂... HDU 2041--超级楼梯
首先题目:
一只小蜜蜂...
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 93009 Accepted Submission(s): 33088
Problem Description
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
Input
输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b(0<a<b<50)。
Output
对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数,每个实例的输出占一行。
Sample Input
2 1 2 3 6
Sample Output
1 3
超级楼梯
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 73863 Accepted Submission(s): 37772
Problem Description
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。
Output
对于每个测试实例,请输出不同走法的数量
Sample Input
2 2 3
Sample Output
1 2
分析
首先,对于蜜蜂问题,当要到第b个时,从第b-1和第b-2个都可一步走到第n个。
所以总体,到第b蜂房个的路程数,就可以转化为 第b-1个蜂房道路+第b-2个的道路数。
而超级楼梯问题也可按照这样的思路求解。
第n阶楼梯可以由第n-1阶和第n-2阶一步上去。
故这类问题都可以表示为: f(n)=f(n-2)+f(n-1),n>3
即可递推求解。同时由 求解的 f(n)=f(n-2)+f(n-1),n>3 叫做 斐波那契数列
斐波那契数列代码表示
递归方法:
#include<stdio.h>
#include<stdlib.h>
int Fibonacci_sequence(int n)
{
if (n == 1 || n == 2) // 递归结束的条件,求前两项
return 1;
else
{
return Fibonacci_sequence(n - 1) + Fibonacci_sequence(n - 2); // 如果是求其它项,先要求出它前面两项,然后做和。
}
}
int main()
{
int i = 0;
int n = 8;
printf("Please enter a number:");
scanf("%d", &n);
i=Fibonacci_sequence(n);
printf("The number is %d\n", i);
system("pause");
return 0;
}
非递归,普通遍历
#include<stdio.h>
#include<stdlib.h>
void Fei(int n) // 非递归
{
int sum = 1;
int sum1 = 1;
int i = 0;
int tem = 0;
if (n < 1)
{
printf("输入数字有误\n");
}
else if (1 == n)
{
printf("第n个斐波那契数是:%d\n", sum);
}
else if(2 == n)
{
printf("第n个斐波那契数是:%d\n", sum);
}
else
{
for (i = 0; i < n - 2; i++) // 第三项等于前两相加
{
tem = sum; // tem 保存原来的sum
sum += sum1; // sum= 前两项相加
sum1 = tem; // sum1 =原来的sum 始终保证第三项等于前两项相加
}
printf("第n个斐波那契数是:%d\n", sum);
}
}
int main()
{
int n = 0;
printf("Please enter a number :");
scanf("%d",&n);
Fei(n);
system("pause");
return 0;
}
也可以进行打表,之后直接提取