Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 河内塔楼:寻找第n个配置_Java_Algorithm_Tail Recursion_Towers Of Hanoi - Fatal编程技术网

Java 河内塔楼:寻找第n个配置

Java 河内塔楼:寻找第n个配置,java,algorithm,tail-recursion,towers-of-hanoi,Java,Algorithm,Tail Recursion,Towers Of Hanoi,考虑到光盘的数量和移动的数量,我想在河内塔问题的解决方案中找到第n个配置 以下代码使用尾部递归查找第n个移动: public static String N_th_Move(int k_discs, int move){ return HanoiRec(k_discs, move, "A", "B", "C"); } private static String HanoiRec(int k_discs, int move, String rod_a, St

考虑到光盘的数量和移动的数量,我想在河内塔问题的解决方案中找到第n个配置

以下代码使用尾部递归查找第n个移动:


  public static String N_th_Move(int k_discs, int move){
        return HanoiRec(k_discs, move, "A", "B", "C");
    }

    private static String HanoiRec(int k_discs, int move, String rod_a, String rod_b, String rod_c) {
        int max_n_moves = (int) (Math.pow(2, k_discs) - 1); 
        int bound =(int) Math.pow(2, k_discs - 1);
        if(move > max_n_moves){
            return "Not valid";
        } else if(move == bound ){
            return rod_a + " -> " + rod_b;
        } else if(move < bound){
            return HanoiRec(k_discs-1, move , rod_a, rod_c, rod_b);
        } else {
            return HanoiRec(k_discs-1, move - bound, rod_c, rod_b, rod_a);
        }
    }


其中,第一个数字是杆_a上的盘数,第二个是杆_b上的盘数,第三个是杆_c上的盘数。 左下叶是第一次移动后的配置,右下叶是最后一次移动后的配置。
我没有找到所有配置之间的关系。

ToH的标准解决方案是交替两种类型的移动:

  • 将最小的圆盘移到下一个杆上(将环绕的圆盘移回初始杆上)
  • 进行不包括最小光盘的合法移动
  • wlog(在不丧失通用性的情况下),让我们假设最小的圆盘总是移动到下一个编号较高的棒(标记为0,1,2)

    该算法的一个结果是奇数盘移动得更高;偶数编号的光碟会向下移动

    另一个结果是,您可以独立地确定任何给定移动编号的光盘:它是该编号二进制表示形式中的最低值
    1
    位。例如,对于3盘问题:

    Move  binary disc
      1     001    1
      2     010    2
      3     011    1
      4     100    3
      5     101    1
      6     110    2
      7     111    1
    
    要查找与任何移动匹配的位置
    N

  • 将二进制文件分成不同的数字
  • 屏蔽每个中最右边的
    1
    位的所有位
  • 添加列
  • 对偶数列求反(以显示光盘向相反方向移动)
  • 减少总模数3

  • 结果是每个光盘所在列的列表。

    ToH的标准解决方案是交替两种移动:

  • 将最小的圆盘移到下一个杆上(将环绕的圆盘移回初始杆上)
  • 进行不包括最小光盘的合法移动
  • wlog(在不丧失通用性的情况下),让我们假设最小的圆盘总是移动到下一个编号较高的棒(标记为0,1,2)

    该算法的一个结果是奇数盘移动得更高,偶数盘移动得更低

    另一个结果是,您可以独立确定任何给定移动编号的光盘:它是该编号二进制表示形式中的最低值
    1
    位。例如,对于3光盘问题:

    Move  binary disc
      1     001    1
      2     010    2
      3     011    1
      4     100    3
      5     101    1
      6     110    2
      7     111    1
    
    要查找与任何移动匹配的位置
    N

  • 将二进制文件分成不同的数字
  • 屏蔽每个中最右边的
    1
    位的所有位
  • 添加列
  • 对偶数列求反(以显示光盘向相反方向移动)
  • 减少总模数3

  • 结果是每个光盘所在列的列表。

    您能解释一下这些配置是什么吗?您需要跟踪状态,以便在第n步完成后可以输出。许多关于河内塔的帖子都有问题,甚至可能是一个问题。这可能不是详细的,但看起来是正确的。@JimMischel
    您需要跟踪状态,以便在进行第n次移动时可以输出状态。
    为什么?如果只进行了正确的移动,则模式是确定的。由于模式是确定的,每个位置都可以与索引关联。然后,只需找到将索引与模式关联的算法。您能解释一下吗这些配置是什么?它们的意思是什么?你需要跟踪状态,以便在第n次移动时可以输出。许多关于河内塔的帖子都有问题,甚至可能是一个问题。这可能没有详细研究,但看起来是正确的。@JimMischel
    你需要跟踪状态,以便在第n次移动完成后可以输出它制作。
    为什么?如果只进行了正确的移动,则模式是确定的。由于模式是确定的,每个位置都可以与索引关联。然后,只需找到将索引与模式关联的算法即可。