【问题标题】:Is there a way to program towers of hanoi without recursion/stacks?有没有办法在没有递归/堆栈的情况下对河内塔进行编程?
【发布时间】:2020-04-29 16:43:45
【问题描述】:

我最近编写了一个使用递归求解河内塔的程序。但是有没有办法在不使用堆栈或递归的情况下解决这个难题——最好是循环或按顺序排列的东西。

这是我使用递归编写的代码:

static void towerOfHanoi(int n, char from_rod, char to_rod, char aux_rod) 
    { 
        if (n == 1) 
        { 
            System.out.println("Move disk 1 from rod " + from_rod + " to rod " + to_rod); 
            return; 
        } 
        towerOfHanoi(n-1, from_rod, aux_rod, to_rod); 
        System.out.println("Move disk " + n + " from rod " + from_rod + " to rod " + to_rod); 
        towerOfHanoi(n-1, aux_rod, to_rod, from_rod); 
    } 

提前感谢您的帮助:)

【问题讨论】:

  • 提示:您通常可以将递归实现替换为使用显式循环和stack 的实现。
  • 河内问题是基于基于略微变化的参数的重复动作 - 坦率地说,我不知道以另一种方式实现:/
  • 这太模糊/宽泛了。您应该尝试自己解决它,并在解决后提出具体问题。关于问题的维基百科页面应该是一个很好的起点:en.wikipedia.org/wiki/Tower_of_Hanoi
  • @MattBall OP 询问是否可以在没有递归和堆栈的情况下完成。具有循环和堆栈的解决方案使用堆栈,因此 OP 需要不同的解决方案。使用堆栈和递归都被认为是递归过程,因此它们对于 CPU 来说确实是相同的。
  • 请尝试一些研究,例如towers of hanoi without recursion/stacks(来自问题标题)网络搜索将为您提供您所寻求的答案。问题因缺乏研究而被否决。

标签: java loops recursion methods towers-of-hanoi


【解决方案1】:

是的。它可以在没有递归和没有堆栈(或模拟堆栈)的情况下进行编程。

关于河内塔的维基百科页面有一个关于 binary solution 的部分,其中 N 盘河内塔的步骤以数字 0 到 2N 的二进制表示形式编码。

我不会在这里复制全部细节,但核心是将移动编号m 转换为要进行的移动的简洁公式:

m 从挂钩(m & m - 1) % 3 移动到挂钩((m | m - 1) + 1) % 3, 其中磁盘从 peg 0 开始并在 peg 1 或 2 上结束,如下所示 磁盘的数量是偶数还是奇数

还有另一种涉及格雷码的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2017-12-26
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2015-03-23
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多