青蛙跳台阶的三种解决方法

法一:递归法 

#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 也在变化

注意:以上纯属个人看法,如有其他想法,欢迎在评论讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值