作者ciakkk040156 (险峻的海峡)
看板java
标题[问题] 新手提问 有关河内塔的递回理解
时间Fri Oct 14 20:49:04 2016
各位前辈好,这是我在ppt第一次发文,因在河内塔题目有所误解,
只好硬着头皮请教各位前辈...
可悲的是我已经google过一些文章後答案竟然也看不懂,
恳请大大们赐教:
import java.io.*;
public class Hanoi {
public static void main(String args[]) throws IOException {
int n;
BufferedReader buf;
buf = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入盘数:");
n = Integer.parseInt(buf.readLine());
Hanoi hanoi = new Hanoi();
hanoi.move(n, 'A', 'B', 'C');
}
public void move(int n, char a, char b, char c) {
if(n == 1)
System.out.println("盘" + n + "由" + a + "移至" + c);
else {
move(n - 1, a, c, b);
System.out.println("盘" + n + "由" + a + "移至" + c);
move(n - 1, b, a, c);
}
}
当输入n=2时会跑出:
(1)盘 1 由 A 移至 B
(2)盘 2 由 A 移至 C
(3)盘 1 由 B 移至 C
对於以上程式码我的理解是
当n=2 即从else开始 move(2-1,a,c,b) 又等於 (1,a,c,b) 所以此时会印出盘1由A移至B
我的疑问在(2)不理解,为什麽此时不是跑回n=1 if条件句且应该要印出盘1由A移至C呢?
这是我在网路上找到的解答:
n=2
Step1: move(n - 1, a, c, b); 等於是 move(1, a, c(相当於b), b(相当於c));
System.out.println("盘 " + n + " 由 " + a + " 移至 " + c); 等於 System.out.println("盘 1 由 a 移至 b);
Step2: System.out.println("盘 " + n + "由 " + a + " 移至 " + c) 等於 System.out.println("盘 2 由 a 移至 c)
Step3: move(n - 1, b, a, c); 等於是 move(1, b(相当於a), a(相当於b), c);
System.out.println("盘 " + n + " 由 " + a + " 移至 " + c); 等於 System.out.println("盘 1 由 b 移至 c);
1.究竟Step2是怎麽生成的?(我有尝试使用eclipse中的debug但失败了可能是方法有错)
谢谢大家的耐心回应,很不好意思但透过大家的帮忙我已经理解了!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.240.146.213
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1476449346.A.BC1.html
1F:→ nodoors: step2是else里第二行@@ 10/14 21:32
2F:→ pttworld: debug在move method下行断点,watch到n=2後单步执行。 10/14 21:39
谢谢大大,我已经学会如何debug了!
但若n=3时,执行到else後此时值为move(2,a,c,b),接着并非往下执行第二行System.out.print(),
後程式跳回if(n==1),再跳回move(n - 1, a, c, b)此时n=1,a=A,b=B,c=C
这是为什麽呢?
※ 编辑: ciakkk040156 (123.240.146.213), 10/14/2016 23:43:28
3F:推 maxsho: 先把if else叙述在做什麽先弄清楚 10/14 23:36
4F:推 maxsho: 当n不是1时,会执行else内的全部叙述 执行move(n-1,a,c,b) 10/14 23:40
5F:推 maxsho: 在执行else中的第二行 System.out.println最後执行 10/14 23:45
6F:→ maxsho: move(n-1,b,c,a) 10/14 23:46
※ 编辑: ciakkk040156 (123.240.146.213), 10/14/2016 23:48:46
7F:推 maxsho: 执行move(2,a,c,b)时因爲n!=1会在先执行一次else的所有叙 10/14 23:53
8F:→ maxsho: 所以才叫递回 10/14 23:53
9F:推 maxsho: 我觉得你先把程式是如何呼叫及执行先搞清楚在来提问比较好 10/14 23:55
m大谢谢你的回覆/解答,自己的确是不太清楚程式的呼叫与执行,
导致问问题也不够精确,我会加油
10F:推 ilms49898723: 同楼上,我不懂你是不懂他递回的逻辑,还是你只是单 10/14 23:58
11F:→ ilms49898723: 纯看不懂code 10/14 23:58
谢谢回覆,下次提问我会整理好思绪再提问
12F:→ ssccg: 如果你不懂method call stack的话,用debug一行一行跑反而 10/15 01:57
13F:→ ssccg: 会混乱以为都在哪几行跳吧 10/15 01:57
14F:→ ssccg: 先试着自己把执行顺序写出来,把method inline展开来看 10/15 01:57
15F:→ ssccg: 递回可能不是很重要,但是一个method call是怎麽回事很重要 10/15 02:00
谢s大回覆,看debug然後专心逐行写出写执行顺序出来让我想通了。
我的问题在於误解值传递的方式以及程式执行的步骤,茅塞顿开的感觉真好!
16F:→ pttworld: step into进入,step out跳出,step over跃往下一步。 10/15 02:47
17F:→ pttworld: 这三个基本的反覆单步执行理解递回原理。 10/15 02:48
感谢p大再度回应,透过你的解释我有尝试用此方法跑简单的递回去理解
18F:推 gmoz: 1进入 2进入 3进入 满足中断 3跑完返回 2跑完返回 1跑完返回 10/15 10:25
19F:→ gmoz: 先拿简单的例子弄清楚递回的运作方式 10/15 10:25
谢谢回应,我会去试试看!
20F:→ adrianshum: 很久以前我在c_cpp 版有回答过河内塔的问题,看看能 10/15 16:55
21F:→ adrianshum: 不能理解? 10/15 16:55
谢谢a大,我有去拜读文章,很清楚的说明!
※ 编辑: ciakkk040156 (123.240.146.213), 10/15/2016 21:20:38