【递归详解】C语言解决汉诺塔问题

目录

一.什么是递归?

二.递归的两个必要条件

三.例题

四.汉诺塔问题 


一.什么是递归?

1.程序自己调用自己的编程技巧被称为递归。它能够把一个大型的、复杂的问题转化成与原问题相似的规模较小的问题。利用递归的思路解决问题,可以将多次重复的计算用少量的代码描述出来。

2.递归的思考方式主要在于把大事化小,把大问题逐渐化为一个个较小的子问题,通过解决子问题,子问题的子问题,这样逐级化简,最终解决原问题。

二.递归的两个必要条件

1.必须存在限制条件,当满足限制条件时,递归终止。

2.递归的每次调用都必须越来越接近限制条件

三.例题

求n的阶乘(不考虑溢出)。

首先我们先要了解什么是n的阶乘,在数学中n的阶乘又写作n!,它表示的是

1*2*3*4...*(n-1)*n其中0!=1

要解决这个问题我们可以这样来分析:

n!=n*(n-1)!

(n-1)!=(n-1)*(n-2)!

(n-2)!=(n-2)*(n-3)!

......

就这样我们把原问题化简成了一个个和原问题相似的较小的问题。

代码实现如下:

int fun(int y)
{
	if (y==0)
	{
		return 1;
	}
	if (y > 0)
	{
		return y*fun(y-1);
	}
}

这里我们以fun(3)举例:

可以看到,递归其实是一个递推出去后回归的过程。最后我们得到3!=6。

四.汉诺塔问题 

什么是汉诺塔问题?

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

 

 

 现在要求我们设计程序,在屏幕上打印出盘子的移动路径。为了便于分析我们分别给每个盘子都标上编号,从下往上依次为n  n-1  n-2  ......  2  1。

分析:对于这样的问题,我们依然可以用递归的思想来分析:

首先我们可以借助B杆,将A杆上的1到n-1个盘子移动到B杆,然后再将A杆上第n个盘子移动到C杆,然后再借助A杆将B杆上1到n-2个盘子移动到A杆,再把第n-1号盘子移动到C杆

执行完这一步后如图所示:

接下来的问题就变成了如何借助B杆,将A杆上n-2个盘子移动到C杆。我们只需继续执行前面的步骤,一步步将问题规模化简就行。

程序代码如下: 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void move(char a,char b)//单独构建一个move函数,用来打印盘子的移动路径
{
	printf("%c-->%c\n", a, b);
}
void Hanoi(int x,char A,char B,char C)
{
	if (x == 1)
	{
		move(A, C);
	}
	else
	{
		Hanoi(x - 1,A, C, B);//把A中1到n-1个盘子借助C挪到B
		move(A, C);//把A中剩下的第n个盘子移动到C
		Hanoi(x - 1, B, A, C);//把B盘中1到n-1个盘子借助A移动到C中
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);//设置汉诺塔问题需要转移的盘子个数
	Hanoi(n,'A','B','C');//把n个盘子借助B挪到C
	return 0;
}

代码执行结果如下:

 代码分析:Hanoi(3)

 

 执行第一步:

 第一步详解:

 注意柱子,这一步中,柱子顺序为ACB

 执行完后位置:

 

 

执行第二部:

 

执行第三步:

 

 

至此,所有步骤都以得出。以下为代码运行结果:

 

 

 感谢你的观看!

  • 26
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值