【发布时间】:2017-10-02 10:39:03
【问题描述】:
我是编码的初学者,我正在研究一些简单的小项目以更熟悉 java。当我遇到这个河内塔代码时。
public class TowersOfHanoi {
public void solve(int n, String start, String auxiliary, String end) {
if (n == 1) {
System.out.println(start + " -> " + end);
} else {
solve(n - 1, start, end, auxiliary);
System.out.println(start + " -> " + end);
solve(n - 1, auxiliary, start, end);
}
}
public static void main(String[] args) {
TowersOfHanoi towersOfHanoi = new TowersOfHanoi();
System.out.print("Enter number of discs: ");
Scanner scanner = new Scanner(System.in);
int discs = scanner.nextInt();
towersOfHanoi.solve(discs, "A", "B", "C");
}
}
我了解谜题的运作方式;但是,我无法理解这段代码如何知道将塔的各个部分移动到哪里而不违反较大的部分不能放在较小的部分上的规则。
此外,由于我对代码的理解非常薄弱,我认为if (n==1){ 不正确,然后它转向了其他。但是,即使我为n 输入不是1 的值,代码也会直接使用if 语句下的信息,而不是跳转到它下面的else 行。
例如,如果我的scanner 输入是 4,那么按照我之前的理解,代码会将scanner 的输入设置为int discs,并将其汇集到towersOfHanoi.solve(discs,"A", "B", "C");。那么这是否意味着当程序启动.solve 方法时int n 将等于4?代码不会再次检查 if(n==1){ 是否不应该......因为我认为它会是 (4==1)。
我确实知道这是问题的递归解决方案,但这真的会影响 java 处理代码的规则吗?
附:如果我使用了任何错误的术语或者我不够清楚,我很抱歉,我正在自学,所以我没有其他人可以问我的问题......而且我没有制作这段代码,我找到了在一个有递归版本的 Java 源代码解决方案的网站上。
【问题讨论】:
-
与程序一起玩游戏。当 n = 4 时,调用 recursive 情况;每次递归调用该方法时,n 都会递减。方法的每次调用都有其自己的不同参数(n = 4,然后在 不同 调用中 n = 3,然后..),即使名称是“共享的” ' 跨调用。
标签: java recursion towers-of-hanoi