欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

时隔七个月,我终于弄懂了汉诺塔的思想

发布时间:2024/10/14 编程问答 25 豆豆
生活随笔 收集整理的这篇文章主要介绍了 时隔七个月,我终于弄懂了汉诺塔的思想 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

目录
1.问题描述
2.汉诺塔的分析
3.博主的反思
4.代码详解

  • 博主在大一的上学期开学没多久看的汉诺塔,在看的过程中,很多地方似懂非懂,但是博主当时没有细品,便匆匆跳过,直到最近感觉自己递归学的不行便又复习一下,果然有了很多的收获

1.问题描述

在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片,1. 一次只移动一片; 2. 不管在哪根针上,小片必在大片上面。当所有的金片都从梵天穿好的那根针上移到另外一概针上时,世界就将在一声霹雳中消灭,梵塔、庙宇和众生都将同归于尽。

2.汉诺塔的分析

假设我们要把A柱子上的金片移动到B柱子上。如果汉诺塔的A柱子有2个金片,那么就是把最上边的哪一个金片移动V柱子上,再把A上面的另一个金片移动到B柱子上,再把V柱子上的金片移动到B柱子上,就完成了工作。

如果有3个就是把上边的第一个金片(最小的)放在B柱子上,第二个金片放在V柱子上,再把第一个金片从B柱子移动到V柱子上,然后把第三个金片(最大的金片)放在B柱子上,再把V柱子上的第一块金片放在A柱子上,再把V柱子上的第二块金片放在B柱子上,最后把A柱子上的第一片金片放在B柱子上,就完成了工作

其实仔细想想只要两个或者两个以上的金片都可以这么看,假如有n(n>=2)个金片,那么其实就只有三步,第一步把上面n-1个金片从A柱子放在V柱子上,把最大的金片放在B柱子上,最后把V柱子上的n-1块金片移动到B柱子上,这就完成了(我们先不管他怎么实现把n-1块金片从一个柱子移动到另一个柱子)。我们把做完第二步的状态分析一下:此时,最大的金片在B柱子上,n-1块金片在V柱子上,由于B柱子上是最大金块,所以可以把B柱子上的金块看作没有(其他n-1块金片都比他小,都能放在这块最大的金片的上面),那么此时又回到了原来的问题,现在是只有n-1块金片把它从V柱子移动到B柱子上(只是金片所在的初始位置的柱子变了而已),依次类推,是不是重复了n次同样的操作把所有的金片从A柱子移动到了B柱子

3.博主在学习汉诺塔遇到的问题

博主比较笨,主要是博主过分的把重心放在代码的实现上,导致博主刚开始看的时候无法理解,但是汉诺塔递归其实就是重复做一件事情,我们不用去管它到底是怎样把B柱子作为辅助,把n-1块金片从A柱子移动到V柱子上,这是递归内部的实现,我们只需要知道他就是在做同一件事情就行

4.代码详解

#include<stdio.h> int hanio(int n,char A,char V,char B) {if(n==1)printf("%c->%c\n",A,B);else{hanio(n-1,A,B,V);//把A柱子的n-1块金片移动到Vprintf("%c->%c\n",A,B);//最大的那一块金片移动到Bhanio(n-1,V,A,B);//把V柱子的n-1块金片移动到B} } int main() {hanio(2,'A','V','B'); }

运行结果

总结

以上是生活随笔为你收集整理的时隔七个月,我终于弄懂了汉诺塔的思想的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。