Dyalog APL汉诺塔递归函数无法正常循环执行的问题排查请求
解决Dyalog APL汉诺塔递归函数的执行问题
你的APL代码无法正常执行到打印语句,主要有两个核心问题:语句分隔错误,以及对APL函数调用语法的误解,我们一步步来修复:
1. 语句分隔错误是核心原因
在Dyalog APL的dfn(用{}定义的函数)中,不同的执行语句必须用换行或者分号分隔。你把所有代码写在一行,导致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 }
APL会把n≤0:⍬ solve(n-1)a b c解析为:当n≤0时,返回⍬ solve(n-1)a b c(这完全不是你想要的逻辑),而后续的打印和递归调用也被合并成了一个表达式,无法按顺序执行。
2. 修正递归调用的语法(可选但更清晰)
APL的函数调用不需要用括号包裹参数(括号仅用于改变运算优先级),正确的递归调用应该是把所有参数作为一个数组传递给函数。虽然solve(n-1)a b c在语法上不会报错,但写成solve (n-1) a b c会更清晰,明确传递四个参数组成的向量。
修正后的完整代码
solve←{ n a c b←⍵ ⍝ 拆分输入参数 n≤0:⍬ ⍝ 递归终止条件,返回空向量 solve (n-1) a b c ⍝ 递归:把n-1个盘子从a移到b,用c作为辅助 ⎕←'Move disk from' a 'to' c ⍝ 打印当前移动步骤 solve (n-1) b c a ⍝ 递归:把n-1个盘子从b移到c,用a作为辅助 }
或者用分号分隔的单行版本:
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'后,你会看到正确的移动步骤输出,和JavaScript版本的结果一致。
为什么你的参数打印显示到0就停了?
当递归到n=0时,函数返回⍬,但因为原代码的语句分隔错误,后续的打印和递归调用根本没有被触发,程序在递归到最底层后就无法回到上一层执行打印逻辑。修正语句分隔后,递归返回时会继续执行后续的打印和递归步骤。
内容的提问来源于stack exchange,提问作者Miroslav Popov
相关产品推荐
相关产品推荐

