ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

汉诺塔问题以及青蛙跳台阶问题(附C语言代码)

2022-10-01 21:22:07  阅读:33  来源: 互联网

标签:


汉诺塔问题:

汉诺塔问题的源于印度一个古老传说的益智玩具。大焚天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照先大后小的顺序摞着64片圆盘。大焚天命令婆罗门把圆盘从下面按大小顺序重新摆放在另一根柱子上,并且规定在小盘子上不能放大盘子,在三根柱子之间一次只能移动一个盘子。

要把A柱上的盘子全部都移动到B柱上,并且要遵循以下规则:

1、一次只能移动原著最上面的一个盘子

2、小盘子上面不能放大盘子。

将一个圆盘从一根柱子移动到另一根柱子上,算是移动一次,那么将n个盘子全部从A柱移动到B柱至少移动多少次呢?

代码实现:

//汉诺塔问题
int x= 0;
void Move(char from, char dest)//移动一个盘子,将盘子从from柱移动到dest柱
{
	printf("将盘子从%c柱移动到%c柱
", from, dest);
	
}
void Han(int n, char x, char y, char z)
{
	if (n == 1)
	{
		Move(x, z);//如果只有一个盘子的话,就将盘子从A柱移动到C柱
	}
	else
	{
		Han(n - 1, x, z, y);//如果有多个(假设是n个)盘子的话,就先将n-1个盘子借助C柱从A柱移动到B柱
		Move(x, z);//将A柱剩下的一个盘子移动到C柱
		Han(n - 1, y, x, z);//再将B柱上的n-1个盘子借助A柱移动到C柱
	}
}

int main()
{
	int num = 0;
	printf("请输入一个数:");
	scanf("%d", &num);//几层汉诺塔
	char A = A;
	char B = B;
	char C = C;
	Han(num, A, B, C);  //将num个盘子借助B柱从A柱移动到C柱
	
	return 0;
}

其中具体代码的实现功能我都加了详细的注释。

运行结果:

如果你想要直到一共移动了多少次,可以加一个计数的变量:

汉诺塔问题在C语言中实现就是利用了函数递归的方法,将A柱上n-1个盘子借助C柱移动到B柱,然后将A柱剩下的一个盘子从A柱移到C柱,再将剩下的n-1个盘子借助A柱从B柱移动到C柱。

以上是汉诺塔问题的原理以及C语言程序,下面介绍青蛙跳台阶的问题。

青蛙跳台阶问题:

青蛙一次可以跳一个台阶,一次也可以跳两个台阶,我们要求青蛙跳n个台阶有几种跳法。

若n = 1,则存在一种跳法。(1)

若n = 2,则存在两种跳法。(1,1) (2)

若n = 3,则存在三种跳法。(1,1,1)(1,2)(2,1)

若n = 4,则存在五种跳法。(1,1,1,1)(1,1,2)(1,2,1)(2,1,1)(2,2)

若n = 5,则存在八种跳法。(1,1,1,1,1)(1,1,1,2)(1,1,2,1)(1,2,1,1)(2,1,1,1)(2,2,1)(1,2,2)(2,1,2)

从上面的例子我们可以发现一个规律:从n=2的时候,每次n增加1时,他所对定的跳法是n-1所对应的跳法加上了n-2对应的跳法。我们这时就可以把青蛙跳台阶问题看成一个类斐波那契数列求解的问题。如果对斐波那契数列求解有疑问的可以看

程序实现:

//青蛙跳台阶的问题
//青蛙一次能跳一个或者两个台阶,求跳n个台阶能有几种跳法
int jump(int n)
{
	if (1 == n)
	{
		return 1;
	}
	else if (2 == n)
	{
		return 2;
	}
	else
	{
		return jump(n - 1) + jump(n - 2);
	}
}

int main()
{
	int step = 0;
	printf("请输入一个数:");
	scanf("%d", &step);
	int ret = jump(step);
	printf("一共有%d 种跳法", ret);
	return 0;
}

标签:
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有