ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

递归——汉诺塔问题

2021-12-25 20:00:02  阅读:184  来源: 互联网

标签:递归 int void 问题 圆盘 moving printf 汉诺塔


递归的两个特点

  • 调用自身

  • 结束条件

  • eg

#include<stdio.h>

void func1(int x)	//没有结束条件,不是递归
{
	printf("%d", x);
	func1(x - 1);
}

void func2(int x)	//没有结束条件,不是递归
{
	if (x > 0)
	{
		printf("%d", x);
		func2(x + 1);
	}
}

void func3(int x)	//递归结果:321
{
	if (x > 0)
	{
		printf("%d", x);
		func3(x - 1);
	}
}

void func4(int x)	//递归结果:123
{
	if (x > 0)
	{
		func4(x - 1);
		printf("%d", x);
	}
}

int main()
{
	//func1(3);
	//func2(3);
	func3(3);
	func4(3);

	return 0;
}

递归实例:汉诺塔问题

  •  大梵天创造时间的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小首先摞着64片黄金圆盘。

  • 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。

  • 在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

  • 64个圆盘移动完毕之日,就是世界毁灭之时


当n=2时


 n个盘子时


  •  代码实现

#include<stdio.h>

void hanoi(int n, char A, char B, char C)
{
	if (n > 0)
	{
		hanoi(n - 1, A, C, B);	//第一步
		printf("moving from %c to %c\n", A, C);	//第2步
		hanoi(n - 1, B, A, C);	//第三步
	}
}

int main()
{
	hanoi(3, 'A', 'B', 'C');

	return 0;
}

输出结果
moving from A to C
moving from A to B
moving from C to B
moving from A to C
moving from B to A
moving from B to C
moving from A to C

  • 汉诺塔移动次数的递推式:h(x)=2h(x-1)+1

  • h(64)=18446744073709551615

  • 假设婆罗门每秒钟搬一个盘子,则总共需要5800亿年!

标签:递归,int,void,问题,圆盘,moving,printf,汉诺塔
来源: https://blog.csdn.net/m0_62080641/article/details/122146997

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

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

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

ICode9版权所有