首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >青蛙跳台问题和汉诺塔问题(递归的拓展)

青蛙跳台问题和汉诺塔问题(递归的拓展)

作者头像
寻星探路
发布2025-12-17 19:48:43
发布2025-12-17 19:48:43
140
举报
文章被收录于专栏:CSDN博客CSDN博客

一、青蛙跳台问题

1.什么是是青蛙跳台问题?

青蛙跳台是我们常见的一种编程问题

题目:一只青蛙跳上前面的台阶(不可以往回跳),青蛙一次可以跳一级台阶或者两级台阶,现有n级台阶(n自行输入),请问青蛙有多少种跳上最顶端台阶的可能。

2.分析和解决问题

我们如果从正面看这个问题,我们会发现,第一次开始青蛙可以跳一级台阶或者两级台阶,随着次数的增加,要按照顺序计算剩余台阶数,这样太过麻烦。

不妨将问题倒过来看,青蛙的目的是要跳上台阶,那么最后要么是在n-1的位置跳一下,要么是在n-2的位置跳两级台阶于是,这个问题就变成了这个样子

到这里,我们不难看出,这就是斐波那契数列的翻版,于是我们就可以得到这样的程序:

代码语言:javascript
复制
int jump(int n)
{	
	if (n == 1)
		return 1;
	if (n == 2)
		return 2;
	return jump(n - 1) + jump(n - 2);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int m = jump(n);
	printf("%d\n", m);
	return 0;
}

解析:

输入数据之后,判断,如果不是1或2,就进行return jump(n - 1) + jump(n - 2),人为让青蛙回到跳上顶点前的位置

接着递归回来接着判断,不都是1或2再次进行递归

如此循环往复,最终青蛙会跳到1或者2的位置上,就可以得到我们想要的结果

(这里的1和2是我们先根据有一级台阶和两级台阶算出来的数据!!!)

二、汉诺塔问题

1.什么是汉诺塔问题

汉诺塔问题是一个经典的递归问题

题目:现有A,B,C三根柱子,在A柱子上从下到上摆放着以大小(越往下,圆盘越大)顺序排列的一摞n个的圆盘(n自行输入),现在需要将A上的圆盘顺序不变的转移到C上,每次只能移动一个圆盘,并且小圆盘要始终在大圆盘的上面,问最快需要多少步才能完成?

2.分析和解决问题

首先,当n=1时,我们可以直接将圆盘移到C上

当n>1时,我们便可以用递归的思想

无论过程怎样,最先要做的一定是把最大的圆盘移动到C上,在这之前的一步,一定是A上仅剩下一个最大的圆盘,B上从下往上、从大到小堆叠着n-1个圆盘(因为规则说了,小圆盘必须在大圆盘上面)。那么这时候B柱也就成为了新的A柱,开始新的操作。

代码语言:javascript
复制
int hanoi(int n)
{
	if (n == 1)
		return 1;
	else
		return 2 * hanoi(n - 1) + 1;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int m=hanoi(n);
	printf("%d\n", m);
	return 0;
}

分析:

如果仅剩下1个圆盘,那么毋庸置疑,它会被移动一次便会结束。

如果剩余的圆盘数量大于一个,我们就进行else操作,直到剩余一个圆盘。

(2 * hanoi(n - 1) + 1)的意思是,现在有n个圆盘(n>1),首先要做的是将上面的n-1个圆盘 移动到辅助柱上(hanoi(n - 1)),然后再去进行下一步,移动最大的圆盘到目标柱上(1),最后还需要再次将辅助柱上的n-1个都放到目标柱上(hanoi(n - 1)),加到一起就有了(2 * hanoi(n - 1) + 1)

3.拓展

当然,我们还可以对程序进行一点升级,将我们的过程打印出来。

代码语言:javascript
复制
int count = 0;

void hanoi(int n,char from,char aux,char to)
{
	if (n == 1)
	{
		count++;
		printf("%d:%c-->%c\n", count,from, to);
	}
	else
	{
		hanoi(n - 1, from, to, aux);
		count++;
		printf("%d:%c-->%c\n", count, from, to);
		hanoi(n - 1, aux, from, to);
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	hanoi(n,'A','B','C');
	printf("%d\n", count);
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档