汉诺塔模拟_C语言源代码(递归和栈)

本文介绍了汉诺塔问题及其C语言解决方案。通过递归思想,将移动n个盘子的问题拆分为更小的n-1个盘子问题,最终实现盘子的转移。同时,利用栈的特性处理盘子存储,实现后放先移的规则。文章附带完整C语言源代码。
摘要由CSDN通过智能技术生成

  一、什么是汉诺塔。

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


  二、怎么使用C语言实现汉诺塔呢?

  首先我们思考下:假如有A,B,C三个柱子和n个盘子。那么如果想把A上的n个盘子借助B移动到C上,那么根据规则我们要移动A上的第n盘子到C的最底端时,那么n-1盘子就需要先从A->B上,然后把B上的n-1个盘子借助A移动到C上。所以从A->C  n个盘子可以分为以下几步:

   ① 首先把A上的n-1个盘子借助C移动到B上

   ② 然后把A上的第n个盘子(也就是现在的最上面的)移动到C上。

   ③ 最后把B上的n-1个盘子借助A移动到C上。

这样我们就可以发现,我们把n个盘子的操作化为n-1个盘子的操作了。那么,很明显的,我们根据这个来使用递归实现n个盘的移动(注意当n=1时,处理结束为止)。

如以下代码:

/* 借助y,把x上面的n个盘移动到z */
void move(int n, hanstack *x, hanstack *y, hanstack *z)
{
	Elemtype tmp=0;

	if(n == 1){
		pop_stack(x,&tmp);
		push_stack(z,tmp);
	}else{
		/* 先进行把x上面的n-1个盘移动到y上 */
		move(n-1, x, z, y);
		/* 把x上面的最后一个盘(
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值