【问题标题】:Dyalog APL - Towers of Hanoi - does not loop properlyDyalog APL - 河内塔 - 无法正确循环
【发布时间】:2021-11-09 13:41:16
【问题描述】:

我无法让它在 Dyalog APL 中工作

 solve←{
     n a c b←⍵
     n≤0:⍬
     solve(n-1)a b c
     ⎕←'Move disk from' a 'to' c
     solve(n-1)b c a
 }

 solve 4 'A' 'C' 'B'

它从第一个 solve (n-1) a b c 循环,但从不转到第 4 行。

同样的代码在 JavaSCript 中也可以工作:

solve = (n, a, c, b) => {
    if (n <= 0) return
    solve(n-1, a, b, c)
    console.log(`Move disk from ${a} to ${c}`)
    solve(n-1, b, c, a)
}

solve(4, 'A', 'C', 'B')

当我打印它显示的输入参数时:

 solve←{
     n a c b←⍵
     ⎕←n a c b
     n≤0:⍬
     solve(n-1)a b c
     ⎕←'Move disk from' a 'to' c
     solve(n-1)b c a
 }

4 ACB
3 ABC
2 ACB
1 ABC
0 ACB

有什么想法吗?

【问题讨论】:

    标签: recursion towers-of-hanoi apl dyalog


    【解决方案1】:

    dfn 将在第一个非赋值时返回。您的两个递归调用都是非赋值,因此该函数不会返回您认为的位置。你可以像这样稍微调整一下:

    solve←{
        (n a c b)←⍵
        n≤0:⍬
        _←∇(n-1)a b c                 ⍝ Capture and ignore result
        ⎕←'Move disk from' a 'to' c
        _←∇(n-1)b c a                 ⍝ Capture and ignore result
        ⍬                             ⍝ Return empty vector
    }
    

    注意使用 进行递归——这是当前dfn 的简写。如果我运行这个修改后的版本,我会得到:

         solve 4 'A' 'C' 'B'
     Move disk from A to B
     Move disk from A to C
     Move disk from B to C
     Move disk from A to B
     Move disk from C to A
     Move disk from C to B
     Move disk from A to B
     Move disk from A to C
     Move disk from B to C
     Move disk from B to A
     Move disk from C to A
     Move disk from B to C
     Move disk from A to B
     Move disk from A to C
     Move disk from B to C
    

    Roger Hui 写了一篇关于这个问题的论文,值得一读:https://www.jsoftware.com/papers/50/50_38.htm

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 2017-05-03
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多