Hanoi 塔问题--递归的实现(第三章 P55 算法3.5)

函数中有直接或间接地调用自身函数的语句,这样的函数称为递归函数。

由于函数自己调用自己,有可能造成死循环。为了避免死循环,要做到两点:

(1)降阶。递归函数虽然调用自身,但并不是简单地重复。它的实参值每次是不一样的。一般逐渐减小,称为将阶。

(2)有出口。即在某种条件下,不再进行递归调用。

 

 

/*  Hanoi塔问题 */
#include<stdio.h>

int c = 0; /* 全局变量,搬动次数 */

void move(char x, int n, char z)
{ /* 第n个圆盘从塔座x搬到塔座z */
	printf("第%i步: 将%i号盘从%c移到%c\n", ++c, n, x, z);
}

void hanoi(int n, char x, char y, char z) /* 算法3.5 */
{ /* 将塔座x上按直径由小到大且自上而下编号为1至n的n个圆盘 */
  /* 按规则搬到塔座z上。y可用作辅助塔座 */
	if (n == 1)
		move(x, 1, z); /* 将编号为1的圆盘从x移到z */
	else
	{
		hanoi(n - 1, x, z, y); /* 将x上编号为1至n-1的圆盘移到y,z作辅助塔 */
		move(x, n, z); /* 将编号为n的圆盘从x移到z */
		hanoi(n - 1, y, x, z); /* 将y上编号为1至n-1的圆盘移到z,x作辅助塔 */
	}
}

void main()
{
	int n;
	printf("3个塔座为a、b、c,圆盘最初在a座,借助b座移到c座。请输入圆盘数:");
	scanf("%d", &n);
	hanoi(n, 'a', 'b', 'c');
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值