Java 为什么这些额外的代码行会导致;“河内之塔”;要增加的移动次数?
我的讲师在一次测试中问了我们以下问题: “鉴于以下代码: 在哈尼塔(11,A,B,C)被执行后,移动的价值是多少?” 我回家编程了这个,移动的次数增加了,在我插入这些代码行之前,我将它称为A(使用11个磁盘,产生了118097个移动!): 在我插入这些代码之前,我已经把这些代码放在了它的位置上。我称之为B(使用11个磁盘,制作2047个动作):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”计算出移动量。任何反馈
我的问题是,这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