解析汉诺塔——明白递归

Posted Jack Chao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析汉诺塔——明白递归相关的知识,希望对你有一定的参考价值。

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

图片里面的就是汉诺塔。把所有盘子按照规定,从A盘子移动到C盘子。这个就是汉诺塔。
那我们怎么解决这个呢?
现在解决之前,我们可以玩玩游戏。
汉诺塔小游戏
大家可以点击玩玩
先要了解一下汉诺塔是怎么玩的,这样我们才有解决思路嘛。
玩好之后大家有没有思路。
当我们的盘子只有一个的时候,很简单,就是A->C对不对。
那我们有两块的时候呢?
我们是不是应该先把第一块盘子放到B盘子才可以。
那我们同样的道理去解决3块盘子的时候。我们是不是可以把两块小的放到B盘子,把第三块放到C盘子,然后解决B上面的两块。
那我们总结一下。
就是先把最后一块上面所有的块从A挪到B,借用C
然后把B上面的所有盘子,挪到C,借用A。
那我们知道这个规律之后,我们来看代码

代码展示

#include<stdio.h>
int bs = 0;
void print(int n, char A, char C)

	printf("第%d步:把第%d块从%c挪移到%c\\n", ++bs, n, A, C);

void hnt(int n, char A, char B, char C)

	if (n == 0)
	
		return;
	
	else
	
		hnt(n - 1, A, C, B);
		print(n, A, C);
		hnt(n - 1, B, A, C);
	

int main()

	int n = 0;
	scanf("%d", &n);
	hnt(n, 'A', 'B', 'C');

看到代码的反应

看到这串代码的第一反应是什么?
哇哦!!!怎么才这么一点点。(这有点没见过世面)

我热爱的代码就是这样的简洁明了。就好像高斯的那个求和公式一样优美。

我们来细节介绍一下如何完成

汉诺塔实现方法解释

我们需要利用B杆将A杆上的所有东西放到C杆上面。而且放置事物的时候只能是大的在下面,小的在上面。每一次移动只能移动一个物块。
我们假设有N个物块在A杆子上面。为了保证把全部的N个物块放到C杆子上去,我们就必须先让第N块放到C杆子的最下面。这样才能保证所有物块保证,下面的永远比上面的大。
那我们在移动第N块的时候,(N — 1)个物块必须先暂时放到B杆子处。
我们依次往上类推,(N — 1)这个物块为了放到C杆子上时,(N — 2)个物块就必须放到B杆上。以此往复,第二个物块为了放到C杆子上,第一个物块就必须先放到B杆子上。
第二个物块放好之后,第三个物块也想去C杆子上,第二个物块只能利用A杆让自己从C杆子放到B杆子。
至于怎么放,我们只需要把第B上的第一物块放到A上,第2物块就能放到B杆子上面了。第一物块放到B杆子上面。(这个步骤我们不必体现在代码上,我们只需要知道,我们借用A杆,将C杆子上的东西放到B杆子上。)
那我们持续好上面的步骤之后,我们发现,前(N — 1)个物块全部都在B杆子上面了。
那我们就要把A杆子上的第N个物块放到C杆子上。之后,我们遇到的问题就是,怎么把B杆子上的(N — 1)个物块放到C杆子上去。
那我们可以想象,此时的B杆子是不是像极了一开时的A杆子呢?只是比当时的A杆子少了一个物块。那我们就需要依照上面的思想借助A杆子放到C杆子上面。
我们化成步骤就是:
一:借助C杆子把第N块之前的(N — 1)个物块放到B杆子上。
这一步就代表着hnt()函数里面的

hnt(n - 1, A, C, B);

二:将A杆子上的第N块放到C杆子上去。
这一步就是hnt()函数里面的

print(n, A, C);

三:假想现在的B杆子是最开始的A杆子,我们需要借助A杆子把B杆子上面
的(N — 1)个物块放到C杆子上面。
这一步就是hnt()函数里面的

hnt(n - 1, B, A, C);

因为我们用的是递归函数,我们要有一个结束。要不然就是一直死递归,就像一头犟牛,怎么也拉不回来了
所以就是hnt()函数的

if (n == 1)
	
		return;
	

递归是博大精深的,还有好多东西需要学习。大家多敲敲、

以上是关于解析汉诺塔——明白递归的主要内容,如果未能解决你的问题,请参考以下文章

面试题 08.06. 汉诺塔问题(非递归实现汉诺塔问题)

分治 + 递归之汉诺塔问题详解

汉诺塔递归问提

汉诺塔递归思维

汉诺塔递归问题

解析汉诺塔——明白递归