APL中如何实现相互递归?

How to make mutual recursion in APL?

我正在 Dyalog APL Win10 中尝试以下相互递归示例:

      even ← { (odd  ⍵-1) ∨ ⍵=0 }
      odd  ← { (even ⍵-1) ∧ ⍵>0 }
      even 7
WS FULL

看起来 不会在达到定义状态时停止评估。 WS FULL 显示递归确实有效但没有正确终止。

如何在APL中实现相互递归?

PS。 我是 APL 的新手,不知道 函数的正确语法。无论如何,如果可能的话,我更喜欢更“实用”的风格。

由于是普通函数,不会短路,所以要用“guards”代替:

      even ← {⍵=0:1 ⋄ odd ⍵-1}
      odd  ← {⍵>0:even ⍵-1 ⋄ 0}
      even 7
0

或者,您可以定义自己的短路运算符。你可以找到现成的定义 on APLcart:

      OR   ← {⍺⍺ ⍵:1 ⋄ ⍵⍵ ⍵}
      AND  ← {⍺⍺ ⍵:⍵⍵ ⍵ ⋄ 0}
      even ← {=∘0 OR  (odd  -∘1) ⍵}
      odd  ← {>∘0 AND (even -∘1) ⍵}
      even 7
0