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');
}

运行结果:

发布了135 篇原创文章 · 获赞 64 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_42185999/article/details/104992947
今日推荐