递归——汉诺塔问题

递归的两个特点

  • 调用自身

  • 结束条件

  • 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亿年

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如何写出最优雅的代码

感谢支持,我将继续努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值