gpt4 book ai didi

java - 为什么这些额外的代码行会导致 "Towers of Hanoi"的移动次数增加?

转载 作者:行者123 更新时间:2023-12-02 04:03:03 26 4
gpt4 key购买 nike

我的讲师在测试中向我们提出了以下问题:

给出以下代码:

int count=0;
static void towersOfhanoi(int n, char source, char target, char spare)
{
count++;
if (n==1)
System.out.println("move a disk from "+source+" to "+target);
else
{
towersOfhanoi(n-1, source, spare, target);

System.out.println("move a disk from "+source+" to "+target);

towersOfhanoi(n-1, spare, target, source);
towersOfhanoi(1, spare, source, target);
towersOfhanoi(n-1, source, spare, target);

执行 towersofhanoi(11, A,B,C) 后,移动的值(value)是多少?”

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

            towersOfhanoi(n-1, spare, target, source); 
towersOfhanoi(1, spare, source, target);
towersOfhanoi(n-1, source, spare, target);

在插入这些代码之前,我已将这些代码行放在其位置。我将其称为 B(使用 11 个磁盘,产生 2047 步):

            towersOfhanoi(n-1, spare, target, source); 

我的问题是,A中的3行代码做了什么?为什么步数会变化?是否有计算步数的公式?我知道可以使用 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),则原解的解为移动次数(源码如下):

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

对 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

关于java - 为什么这些额外的代码行会导致 "Towers of Hanoi"的移动次数增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34688456/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com