java - 汉诺塔计划为何有效?

标签 java recursion towers-of-hanoi

我是一个编码新手,我正在开发一些简单的小型项目,以更加熟悉 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){ 不成立,然后它会转向 else。但相反,即使我输入的 n 值不是 1,代码也会直接利用 if 语句下的信息跳转到其下方的 else 行。

例如,如果我的 scanner 输入为 4,那么按照我之前的理解,代码会将 scanner 的输入设置为 int 光盘 并将其汇集到 towersOfHanoi.solve(discs,"A", "B", "C");。那么这是否意味着当程序调用 .solve 方法时 int n 将等于 4 ?代码是否会再次检查是否 if(n==1){ 它不应该...因为我认为它会是 (4==1).

我确实知道这是问题的递归解决方案,但这真的会影响java处理代码的规则吗?

附注如果我使用了任何错误的术语或者如果我不够清楚,我很抱歉,我正在自学,所以我没有其他人来问我的问题......而且我没有制作这段代码,我找到了它在一个网站上,该网站提供了该难题的递归版本的 java 源代码解决方案。

最佳答案

I thought that if (n==1){ was not true then it moves on to the else. But instead of that even when I enter values for n that aren't 1 the code moves to utilize the information directly under the if statement

除非链式输入的值减少到 1,否则您的输入将保持不变,因为以下语句,例如:-

solve(n - 1, start, end, auxiliary);
<小时/>

假设您提供 n =3,

在第一次迭代时,控制权移至 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)

正是递归的尾部,并且必须退出它,因此总是会到达。

关于java - 汉诺塔计划为何有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46518747/

相关文章:

java - 如何将 JMX 参数传递到 Spring 应用程序上下文

java - 在 Java 中解密 linux encfs(标准配置,192 位 aes)

c++ - std::swap 在 VS 2013 中导致无限递归

javascript - 从mysql表递归问题构建树数据结构

java - 即使从递归返回后,LinkedList 仍保留值

lisp - ' ('(LIST) ' 无 'NIL) should be a lambda expression in (hanoi(' ('(list)' ()'())))

c++ - 了解 c++ 代码 : Tower of Hanoi using Recursion

Java范围输入困惑

java - Java中静态 block 的线程安全

java - varargs 的非常奇怪的编译错误