编程小白碰到汉诺塔

前言

To iterate is human, to recurse, divine. — L. Peter Deutsch    人理解迭代,神理解递归。

像我这种编程小白第一次听到这句话的时候,为之震撼,什么样的超级大脑才能总结出这么深邃的话!

 

抛砖引玉

谈到递归, 汉诺塔实际是经典到不能再经典的例子了,   每个数据结构的教材对会提到.提到汉诺塔,就不得不说那个原汁原味的印度古老的传说:

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

 简而言之就是:

给汉诺塔传说中三根柱子分别用英文字母a,b,c命名,其中只有a柱子摆放n片圆盘(1<=n<=100000), 若要把a柱子上的所有圆盘转移到c柱子上,问最少需要移动多少次圆盘。

移动圆盘的规则如下:

  1. 每次只能移动一片圆盘
  2. 直径大的圆盘必须摆放在直径小的圆盘之上

 

思路分析

作为小白来说,就是 1>C,2>B,然后1>B(此时B柱上面有1,2),3>C;

再次将1>A(此时A柱上为1,B柱上为2,C柱为3)

然后2>C,1>C;(将B柱上的2移到C柱,将A柱上的1移到C柱)

不管是在纸上画草稿,还是掰手指头算,总之是,将A柱上的123,移到了C柱,并且每次只能移动一片圆盘,直径大的圆盘必须摆放在直径小的圆盘之上!

三个盘子咱们一共移动了七次!

 程序执行

#include <stdio.h>

int num=0;
void hanio(int n,char a,char b,char c){    //n是盘的个数 A,B,C为三个放盘的塔
        if(n==1){
            num++;                                // 移动一次加一次
            printf("第%d次 %c-->%c\n",num,a,c);    //打印A移动到C
        }else{
            hanio(n-1,a,c,b);                    //n-1次 A通过C移动到B
            num++;                                // 移动一次加一次
            printf("第%d次 %c-->%c\n",num,a,c);  //打印A移动到C
            hanio(n-1,b,a,c);                    //n-1次 B通过A移动到C
        }
    }
int main() {
    int n=3; //3个盘子,n=3,4个盘子,n=4,多少个盘子,n就等于多少!
    hanio(n,'A','B','C');
}

好像是这个意思.yes~

发布了40 篇原创文章 · 获赞 6 · 访问量 6823
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览