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
我正在 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