当前位置:编程学习 > JAVA >>

不理解“汉诺塔”代码,大家能不能帮帮我

这是一个“汉诺塔”代码,它执行过程是怎么样的啊?我知道用的是递归,可还是看不明白。大家能不能教一教我啊?还有,我想问问它们的位置不一样有影响吗(见黄色高亮显示区)?
http://imm.io/84ox
http://imm.io/84pJ --------------------编程问答-------------------- 不明白,LZ你不明白就多举几个例子看看怎么弄的~ --------------------编程问答-------------------- 虽然递归调用的方法一样,每次参数是不一样。LZ可以只用三块自己手动移动一下。
看一下运行的过程 --------------------编程问答-------------------- 建议先只用少数的几个来显测试下,例如4个盘子的移动。
看一步步的移动,然后增加到5个,就是说先要把最后的一个先放到边。
然后就只需要移动4个了。这样就和之前的4个是一样的移动了。
等于是重复了前面的操作。这样多试试多想想应该就清楚了
一开始的时候 递归的比较难理解的。
不过自己试过了,想明白了就好了
说的不是很清楚,希望对LZ的理解能有点帮助 --------------------编程问答-------------------- 自己动一下  经典递归 --------------------编程问答-------------------- lz自己敲下代码,加深理解 --------------------编程问答-------------------- 看懂问题描述,数据模型,建好数据结构也就会了哦。。。。 --------------------编程问答-------------------- 多学习  其他类型的递归算法   再看这个 稍微经典的    就好理解多了啊 --------------------编程问答-------------------- 我当时自己写过这个代码.....
大概思路就是如果是n个盘子的话,他的前一步应该是把n-1个盘子从第一个柱子挪到第二个,然后把第n个盘子挪到第三个柱子,然后接下来的事情就是把第二个柱子当成第一个柱子处理,也就是把n-2个盘子又从第二个柱子到第一个柱子后爸第n-1个盘子放在第三个柱子上!从而形成递归 --------------------编程问答--------------------
引用 8 楼 cjbms 的回复:
我当时自己写过这个代码.....
大概思路就是如果是n个盘子的话,他的前一步应该是把n-1个盘子从第一个柱子挪到第二个,然后把第n个盘子挪到第三个柱子,然后接下来的事情就是把第二个柱子当成第一个柱子处理,也就是把n-2个盘子又从第二个柱子到第一个柱子后爸第n-1个盘子放在第三个柱子上!从而形成递归

郁闷,离写这个程序好久了,这种东西写着写着自己都乱了,这个里面目标柱子是三柱子,初始柱子是一柱子,二柱子就是个临时柱。刚才中间差了一步,就是把第n个盘子从初始一柱子挪到目标第三个柱子以后是要把n-1个盘子从第二个柱子挪到第三个柱子,也就是每n个盘子需要挪动两个n-1个盘子和第n个盘子,第一次要将n-1从第一个柱子到第二个柱子就是把二柱子当成目标柱子,即二柱子跟三柱子作用对换,第二次的n-1个盘子从第二柱子到第三柱子,是把第二柱子当成初始柱子,也就是初始一柱子跟临时二柱子作用对换,每次调用都是如此。 --------------------编程问答-------------------- 假设3个杆子 a b c, 要把 a 杆子的盘移动到 c
那么
只有 1 个盘的时候,很简单,直接就是 从 a 移到 c
有 2 个盘的时候,就是先把最上的盘从 a 移到 b, 然后把最下的盘从 a 移到 c,然后把 b 的盘 移到 c
有 3 个盘的时候,先把最上的盘从 a 移到 c,然后把中盘从 a 移到 b,然后 c 盘移到 b,此时 b 中有 n-1=2 个盘,即先把 n-1 个盘从 a 移到 b, 然后接下来把最大的盘从a 移到 c,此时 a 变为空,到这里可以发现,只要递归,让 b 的 n-1 个盘通过 a 辅助,移到 c 就可以了,即 b 的最小盘移到 a,然后 b 的中盘移到 c,然后 a 的小盘移到 c

所以,可以看到的规律就是
n 个盘从 a 移到 c,那么就先让 c 作为辅助,把 n-1 个盘从 a 移到 b,然后 a 的 n 盘移到 c,然后把 a 作为辅助,把 n-1 个盘从 b 移到 c

void move(int n, char a, char b, char c) {
    if (n == 1) { //一个盘的时候,很简单,直接从a移到c
        System.out.println("盘" + n + "从" + a + "移到" + c);
    } else {//多个盘的时候
        move(n-1, a, c, b); //先以c最为辅助,把n-1个盘从a移到b
        System.out.println("盘" + n + "从" + a + "移到" + c); //然后把n盘从a移到c
        move(n-1, b, a, c); //然后再以a作为辅助,把b的n-1个盘移到c
    }
}
  --------------------编程问答-------------------- 去学离散数学吧
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,