gpt4 book ai didi

recursion - Dyalog APL - 汉诺塔 - 无法正常循环

转载 作者:行者123 更新时间:2023-12-05 02:37:49 29 4
gpt4 key购买 nike

我无法让它在 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

有什么想法吗?

最佳答案

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

关于recursion - Dyalog APL - 汉诺塔 - 无法正常循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69899217/

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