法一:递归法
#define _CRT_SECURE_NO_WARNINGS
//青蛙跳台阶问题:
//法一:递归法
#include<stdio.h>
//int Forg_Jump_Stairs(int i)
//{
// if (i == 1)
// return 1;
// else if (i == 2)
// return 2;
// else
// return Forg_Jump_Stairs(i - 1) + Forg_Jump_Stairs(i - 2);
//}
//
//int main()
//{
// int n = 0;//台阶的个数
// scanf("%d",&n);
// int c = Forg_Jump_Stairs(n);
// printf("青蛙走%d级台阶有%d种跳法\n",n,c);
// return 0;
//}
思路:
法二:动态规划算法
//法二:动态规划算法
//#define MAX 100
//int ClimbStairs(int number)
//{
// if (number == 1)
// return 1;
// else if (number == 2)
// return 2;
// else
// {
// int dp[MAX];
// dp[1] = 1;
// dp[2] = 2;
// int i = 0;
// for (i = 3; i <= number; i++)
// {
// dp[i] = dp[i - 1] + dp[i - 2];
// }
// return dp[number];
// }
//}
//
//int main()
//{
// int n = 0;
// printf("请输入楼梯的阶数: ");
// scanf("%d",&n);
// int ways = ClimbStairs(n);
// printf("%d 阶楼梯一共有 %d 种跳法。\n", n, ways);
// return 0;
//}
思路:本质与递归并无区别,只不过通过循环的方式,只把上一次的的结果存下来了
好处:这种方法的核心在于只保存当前状态及其前几个必要状态的信息,从而减少不必要的存储开销并提高运行效率
法三:斐波那契数列法
int fbnp(int n)
{
int first = 0;
int second = 1;
int tem = 0;
while (n--)
{
tem = first + second;
first = second;
second = tem;
}
return tem;
}
int ClimbStairs(int n)
{
return fbnp(n);
}
int main()
{
int n = 0;
printf("请输入楼梯的阶数: ");
scanf("%d",&n);
int ways = ClimbStairs(n);
printf("%d 阶楼梯一共有 %d 种跳法。\n", n, ways);
return 0;
}
如何理解:可把 tem 看作 f(n) , first 看作f(n - 1), second 看做 f(n-2); first ,second 不断更新,不断储存着 f(n - 1) 与 f(n -2) 的值,这时 n 也在变化
注意:以上纯属个人看法,如有其他想法,欢迎在评论讨论