递归——青蛙跳台阶问题

1.青蛙跳台阶问题

青蛙跳台阶问题就是关于一只青蛙再跳台阶时,一次能跳一个台阶或两个台阶,那么求出这只青蛙跳到第n个台阶有几种方法。

2.问题分析

简单分析下问题,青蛙跳一个台阶时,方法只有一种,那就是一次跳一个台阶,但是在跳两个台阶时,有跳一个台阶加一次跳1个台阶和一次挑2个台阶的方法,跳三个台阶时有1 1 1、1 2和2 1的三种跳法,由此可知,随着阶数的增加,问题会越来越复杂。

3. 列表分析

当我们遇到复杂的问题时,我们可以简单列一个表。

阶数1234567
方法数量123581321

由表可知,青蛙跳台阶问题可以简化成一个斐波那契数列 。那为什么会是一个斐波那契数列呢?接着让我来给大家分析一下。以跳6个台阶为例,当第一次跳一个台阶时,就还剩5个台阶,那么跳6个台阶的方法数量就等于跳1个台阶的方法数量加上跳5个台阶的方法数量。当第一次跳两个台阶时,那么还剩4个台阶的数量要跳,这时,跳6个台阶的方法数量就等于跳2个台阶的方法数量加上跳4个台阶的方法数量。以此类推,当我们要跳n个台阶时,方法数量就等于跳(n-1)个台阶的方法数量加上跳1个台阶的方法数量或者等于跳2个台阶的方法数量加上(n-2)个台阶的方法数量。

4.图示

如上图所示,上面的阿拉伯数字表示跳完一次之后,剩余的台阶数量。由图可知,无论跳多少个台阶,最终都会剩下1个或2个台阶,所以当我们使用递归时,可以让这两种情况作为最终返回值,即f(1)==1和f(2)==2。

所以根据这个思路画出递归的函数图。

5.代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int jump(int a)
{
	if (a == 1)
	{
		return 1;
	}
	if (a == 2)
	{
		return 2;
	}
	else
	{
		return jump(a - 1) + jump(a - 2);
	}
}
int main()
{
	int a = 0;
	printf("请输入青蛙要跳的阶数:");
	scanf("%d", &a);
	int ret = jump(a);
	printf("青蛙跳到%d有%d种方法", a, ret);
	return 0;
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值