Почему эта программа Ханойской башни работает?
Я новичок в кодировании, и я работал над несколькими простыми мини-проектами, чтобы лучше познакомиться с 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?
PS Я прошу прощения, если я использовал какую-либо терминологию неправильно или если я не достаточно ясен, я учу себя, и поэтому у меня больше нет никого, чтобы задавать мои вопросы... Также я не сделал этот код, я нашел это на сайте, который имел рекурсивную версию решения исходного кода Java для головоломки.
1 ответ
Я подумал, что если (n==1){не соответствует действительности, то оно переходит к другому. Но вместо этого, даже когда я ввожу значения для n, которые не равны 1, код перемещается, чтобы использовать информацию непосредственно под оператором if
То, что вы думали, остается для вашего ввода, если значение цепного ввода не уменьшается до 1, из-за следующего утверждения, например:-
solve(n - 1, start, end, auxiliary);
Скажем, когда вы предоставляете n =3,
На 1-й итерации управление перемещается в 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)
именно хвост вашей рекурсии и является обязательным для выхода из него, следовательно, всегда будет достигнут.