Java 为什么这个河内塔项目能起作用?

Java 为什么这个河内塔项目能起作用?,java,recursion,towers-of-hanoi,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 {

我是一个完全的编码初学者,我正在做一些简单的小项目来更加熟悉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 discs
,并将其导入到
hanoi.solve塔(discs,“A”、“B”、“C”)所以,这难道不意味着当程序调出
时,solve
方法
intn
将等于
4
?并且代码不会再次检查
如果(n==1){
它不应该…就像我想的那样
(4==1)

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

另外,如果我使用了错误的术语,或者我不够清楚,我很抱歉,我在自学,所以我没有其他人来问我的问题……而且我也没有编写这段代码,我在一个网站上找到了它,该网站有一个java源代码解决难题的递归版本

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

由于以下陈述,您的想法将保留您的输入,除非链接输入的值减少到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)
正是递归的尾部,必须退出,因此总是可以到达

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

由于以下陈述,您的想法将保留您的输入,除非链接输入的值减少到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)

正是递归的尾部,必须退出,因此始终可以到达。

与程序一起玩游戏。当n=4时,调用递归大小写;每次递归调用方法时,n都会递减。方法的每次调用都有自己的不同参数(n=4,然后在不同的调用中n=3,然后..),即使名称在调用之间“共享”。与程序一起玩游戏。当n=4时,递归大小写被调用;每次递归调用该方法时,n都会递减。方法的每次调用都有它自己的不同参数(n=4,然后在另一个调用中n=3,然后…),即使名称在不同的调用中是“共享”的。非常感谢,这有助于消除这么多的混淆!@GilgameshCraos cool,如果有帮助,请接受它作为答案:)非常感谢你,这帮我澄清了这么多的困惑!@GilgameshCraos酷,如果有帮助,请接受它作为回答:)