通过河内塔问题来熟悉递归的用法

                                                       递归方法解河内塔 

递归思想的概念:即将一个复杂问题分解成一系列小的问题,并且这些小问题都具有相同的情形。此时可运用递归的思想来解决更易于理解(但并不一定是效率最高的哦);


递归算法有三个关键点:1)了解题意是否适用递归来解决;

                                          2)  有明确的终止条件(通常是分解出来的一系列小问题里最简单的那种情况); 

                                          3) 随着递归算法的演进,数据规模在递减,决定递归执行部分;
   另外注意的一点是递归与循环之间的关系,一般来说,用循环能解决的问题用递归也能解决,但能用递归的问题不一定能用循环解决;

汉诺塔问题想必大多数人都不陌生,它是递归思想的一个经典例子,这里只是简述一下:

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

                                         《通过河内塔问题来熟悉递归的用法》

设计思路:由图我们可以定义出圆盘原先所在桩为“来源桩”(from),铁盘预以往”目的桩(to)”,而另一个桩为“辅助桩(auxiliary)”当圆盘为三个时,需把圆盘一移往目的桩,再把圆盘二移往辅助桩,把圆盘一移到辅助桩圆盘二上,然后把圆盘三移到目的桩。。。。。。.

以此类推,可知当未移往目的桩的圆盘数为1时,则将最后所剩的铁盘移至目的桩,即完成工作。

否则,(1)将前N-1个圆盘从源桩移往辅助桩;(2)将编号为N的铁盘从源桩移往目的桩;(3)将前N-1个圆盘从辅助桩移往目的桩。

程序代码:

#include <stdio.h>

int step_number;
void move(char x,char y,int number)
{	
	step_number++;
	printf("The step %d:",step_number);
	printf("move disk %d from %c to %c\n",number,x,y);
	
}
int hanoi(int n,char from,char auxiliary,char to)
{	
	if(n==1)
		move(from,to,1);
	else{
		hanoi(n-1,from,to,auxiliary);
		move(from,to,n);
		hanoi(n-1,auxiliary,from,to);
	}
}
void main()
{
	int disk_number;

	printf("The power of Hanoi program.\n");
	printf("please enter the number of disks:");
	scanf("%d",&disk_number);
	printf("The step to moving %d diskes:\n",disk_number);
	hanoi(disk_number,'A','B','C');

}

这是盘子数为4是程序运行的结果:

The power of Hanoi program.
please enter the number of disks:4
The step to moving 4 diskes:
The step 1:move disk 1 from A to B
The step 2:move disk 2 from A to C
The step 3:move disk 1 from B to C
The step 4:move disk 3 from A to B
The step 5:move disk 1 from C to A
The step 6:move disk 2 from C to B
The step 7:move disk 1 from A to B
The step 8:move disk 4 from A to C
The step 9:move disk 1 from B to C
The step 10:move disk 2 from B to A
The step 11:move disk 1 from C to A
The step 12:move disk 3 from B to C
The step 13:move disk 1 from A to B
The step 14:move disk 2 from A to C
The step 15:move disk 1 from B to C

(注:由于定义是用的整形,所以盘子数太大时会溢出,故解过大盘数时需做些修改)

如果写的不好的地方请批评指正,大家发现问题共同进步。

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/wschq/article/details/11263817
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞