为什么这个河内塔计划有效?
Why does this Tower of Hanoi program work?
我是一个完全的编码初学者,我正在做一些简单的小型项目以更加熟悉 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 处理代码的规则吗?
P.S。如果我使用了任何错误的术语或者我不够清楚,我深表歉意,我正在自学,所以我没有其他人问我的问题......而且我没有制作这段代码,我找到了它在一个具有递归版本的 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)
在第 2 次迭代时,它到达 else
并再次调用
solve(1, start, end, auxiliary) // and you know this would reach if(n==1) next time
以上迭代是递归的结果,其中您使用不同的值从内部调用相同的方法。语句
if(n==1)
恰好是递归的尾部,必须退出它,因此总是会到达。
我是一个完全的编码初学者,我正在做一些简单的小型项目以更加熟悉 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 处理代码的规则吗?
P.S。如果我使用了任何错误的术语或者我不够清楚,我深表歉意,我正在自学,所以我没有其他人问我的问题......而且我没有制作这段代码,我找到了它在一个具有递归版本的 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)
在第 2 次迭代时,它到达 else
并再次调用
solve(1, start, end, auxiliary) // and you know this would reach if(n==1) next time
以上迭代是递归的结果,其中您使用不同的值从内部调用相同的方法。语句
if(n==1)
恰好是递归的尾部,必须退出它,因此总是会到达。