【问题标题】:Why does this Tower of Hanoi program work?为什么这个河内塔计划有效?
【发布时间】: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


【解决方案1】:

我认为如果 (n==1){ 不正确,那么它会转到 else。 但是,即使我输入的 n 值不是 1 代码移动以直接利用 if 语句下的信息

除非链接输入的值减少到 1,否则您认为输入的内容会保留,因为以下语句,例如:-

solve(n - 1, start, end, auxiliary);

假设你提供 n =3,

在第 1 次迭代中,控制移动到 else 并使用

调用相同的方法
solve(2, start, end, auxiliary)

在第二次迭代中,它到达else 并再次调用

solve(1, start, end, auxiliary) // and you know this would reach if(n==1) next time

上述迭代是递归的结果,其中您从内部调用具有不同值的相同方法。声明

if(n==1)

正是你的递归的尾部,是退出它的必要条件,因此总是会到达。

【讨论】:

  • 非常感谢,这有助于消除这么多的困惑!
  • @GilgameshCraos 很酷,如果有帮助,请接受它作为答案:)
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多