为什么这个河内塔计划有效?

时间:2017-10-02 02:24:58

标签: 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){不正确然后转移到其他地方。但是,即使我输入的n的值不是1,代码仍会直接在if语句下使用信息,而不是跳转到{{1在它下面划线。

例如,如果我的else输入为4,那么我之前理解它的方式,代码会将scanner的输入设置为scanner和漏斗到int discs。那么这不意味着当程序提起时towersOfHanoi.solve(discs,"A", "B", "C");方法.solve将等于int n吗?并且不会再检查代码,看看4它不应该......我认为它是if(n==1){

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

P.S。如果我使用任何错误的术语或者我不够清楚,我自学,所以我没有其他人可以提出我的问题,我道歉...我也没有。做这个代码,我发现它在一个网站上有一个递归版本的Java源代码解决方案。

1 个答案:

答案 0 :(得分:1)

  

我认为如果(n == 1){不是真的那么它就转移到了其他地方。   但是,即使我输入n的值也不是那个,而不是那个   代码移动以直接在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)

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