java - 如果语句在汉诺塔解决方案中无法正常工作

标签 java if-statement recursion

在这段代码中,为了找到汉诺塔问题的解决方案,我将 N(磁盘数量)设置为 4,作为示例,当我运行时,它会打印出以下内容:

import java.util.Scanner;
public class HanoiTower {

  public static void main(String[] args) {
    int N;
    Scanner in=new Scanner(System.in);
    System.out.println("Choose number of disks? ");
    N= in.nextInt();
    in.close();
    towers(N,0,1,2);        
  }

  static void towers(int disks, int a,int b, int spare){ 

    if (disks==1){
      System.out.println("Move disk 1 from 1 to 2 ");
    }
    else{
      towers(disks-1, a,spare,b);
      System.out.printf("Move disk %d from stack %d to stack %d ", disks, a, b);
      towers(disks-1,spare,b,a);
    }
  }
}

我的疑问是为什么它首先打印 if 语句?

 Move disk 1 from 1 to 2 
 Move disk 2 from stack 0 to stack 2 Move disk 1 from 1 to 2 
 Move disk 3 from stack 0 to stack 1 Move disk 1 from 1 to 2 
 Move disk 2 from stack 2 to stack 1 Move disk 1 from 1 to 2 
 Move disk 4 from stack 0 to stack 2 Move disk 1 from 1 to 2 
 Move disk 2 from stack 1 to stack 0 Move disk 1 from 1 to 2 
 Move disk 3 from stack 1 to stack 2 Move disk 1 from 1 to 2 
 Move disk 2 from stack 0 to stack 2 Move disk 1 from 1 to 2 
 Move disk 5 from stack 0 to stack 1 Move disk 1 from 1 to 2 
 Move disk 2 from stack 2 to stack 1 Move disk 1 from 1 to 2 
 Move disk 3 from stack 2 to stack 0 Move disk 1 from 1 to 2 
 Move disk 2 from stack 1 to stack 0 Move disk 1 from 1 to 2 
 Move disk 4 from stack 2 to stack 1 Move disk 1 from 1 to 2 
 Move disk 2 from stack 0 to stack 2 Move disk 1 from 1 to 2 
 Move disk 3 from stack 0 to stack 1 Move disk 1 from 1 to 2 
 Move disk 2 from stack 2 to stack 1 Move disk 1 from 1 to 2 

最佳答案

您的方法towers会递归,直到disks等于1。您可以在开头记录disks的值,例如

static void towers(int disks, int a, int b, int spare) {
    System.out.printf("Disks = %d%n", disks);
    if (disks == 1) {
        System.out.println("Move disk 1 from 1 to 2 ");
    } else {
        towers(disks - 1, a, spare, b);
        System.out.printf("Move disk %d from stack %d to stack %d ", disks,
                a, b);
        towers(disks - 1, spare, b, a);
    }
}

您可以看到为什么会得到这样的输出。另外,关闭 System.in 周围的 Scanner 也是一个坏主意(一旦关闭 System.in,就无法再次打开它)。

关于java - 如果语句在汉诺塔解决方案中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28944518/

相关文章:

java - 如何在 Spring Boot 应用程序中注册 JavaEE 过滤器?

java - 使用 Mockito stub 并执行测试方法

java - Android Studio : Unsupported major. 次要版本 52.0

c++ - 为什么 if(!(cin >> int)) 在第一次迭代中接受十进制数而不是其他的?

dictionary - 为什么这个 haskey() 条件总是 false?

list - 使用 Prolog 折叠添加列表中的所有项目

c++ - 递归似乎仅在某种程度上起作用-如何调试此类问题?

java - android-support-v4 删除未使用的类

Jquery 模板 - else if 构造

python - 递归代码未按预期工作 - Python 3