Java 为什么这些额外的代码行会导致;“河内之塔”;要增加的移动次数?

Java 为什么这些额外的代码行会导致;“河内之塔”;要增加的移动次数?,java,towers-of-hanoi,Java,Towers Of Hanoi,我的讲师在一次测试中问了我们以下问题: “鉴于以下代码: 在哈尼塔(11,A,B,C)被执行后,移动的价值是多少?” 我回家编程了这个,移动的次数增加了,在我插入这些代码行之前,我将它称为A(使用11个磁盘,产生了118097个移动!): 在我插入这些代码之前,我已经把这些代码放在了它的位置上。我称之为B(使用11个磁盘,制作2047个动作): 我的问题是,这3行代码在A中做了什么?为什么移动的次数会发生变化,有没有计算移动次数的公式?我知道可以使用B的“(2^11)-1”计算出移动量。任何反馈

我的讲师在一次测试中问了我们以下问题:

“鉴于以下代码:

在哈尼塔(11,A,B,C)被执行后,移动的价值是多少?”

我回家编程了这个,移动的次数增加了,在我插入这些代码行之前,我将它称为A(使用11个磁盘,产生了118097个移动!):

在我插入这些代码之前,我已经把这些代码放在了它的位置上。我称之为B(使用11个磁盘,制作2047个动作):


我的问题是,这3行代码在A中做了什么?为什么移动的次数会发生变化,有没有计算移动次数的公式?我知道可以使用B的“(2^11)-1”计算出移动量。任何反馈都会有帮助

嗯,B线是河内塔问题的正确解决方案。A的三行而不是B完全按照它们所说的做:它们使用这些参数递归调用函数。第一行与B相同,因此这是正确的。就问题而言,其他两行没有意义。你把它们放在那里,所以问题更多:你为什么这么做

我猜你想做的是:

   if (n==1) {
        System.out.println("move a disk from "+source+" to "+target);
   } else {
        towersOfhanoi(n-1, source, spare, target); 
        towersOfhanoi(1, source, target, spare); 
        towersOfhanoi(n-1, spare, target, source); 
   }
这将是河内塔问题的另一个正确表达,移动次数与原来的B相同

至于公式:如果我们将n个磁盘的移动次数定义为n(n),则原始解决方案为移动次数(遵循源代码):

对于您的a代码,有一个类似的推理:

N(n) = N(n-1) + 1 + N(n-1) + 1 + N(n-1)
     = 3 * N(n-1) + 2
     = 3^(n-1) + 2 * (3^(n-2) + ... + 1)
     = 3^(n-1) + 2 * (1-3^(n-1)) / (1-3)
     = 2 * 3^(n-1) - 1

好的,我会尽力的。谢谢你的建议谢谢,我想我一定是打错了整整三行了!
            towersOfhanoi(n-1, spare, target, source); 
   if (n==1) {
        System.out.println("move a disk from "+source+" to "+target);
   } else {
        towersOfhanoi(n-1, source, spare, target); 
        towersOfhanoi(1, source, target, spare); 
        towersOfhanoi(n-1, spare, target, source); 
   }
N(n) = N(n-1) + 1 + N(n-1) 
     = 2 * N(n-1) + 1
     = 2 * (2 * (2 * ... (2 * 1 + 1) ... + 1) + 1) + 1)
     = 2^(n-1) + 2^(n-2) + 2^(n-3) + ... + 1
     = (1 - 2^n) / (1 - 2)
     = 2^n - 1
N(n) = N(n-1) + 1 + N(n-1) + 1 + N(n-1)
     = 3 * N(n-1) + 2
     = 3^(n-1) + 2 * (3^(n-2) + ... + 1)
     = 3^(n-1) + 2 * (1-3^(n-1)) / (1-3)
     = 2 * 3^(n-1) - 1