什么是隐式递归?

时间:2009-06-01 23:36:00

标签: haskell functional-programming recursion lisp scheme

什么是隐式递归?它与显式递归有什么不同?

2 个答案:

答案 0 :(得分:6)

我没见过经常使用的术语。谷歌搜索在一本关于lambda演算的书中揭示了一种用法。那本书的论述如下:

  1. 声称是定义的等式不应包括右侧定义的事物。 (我同意这一点。)
  2. 如果这样的等式,如

    FAC = \n. if n = 0 then 1 else n * FAC (n-1),
    

    确实出现了,我们将其称为“隐式递归”并说它是非法的。 (我对此有点怀疑。)

  3. 我不知道为什么这个词被认为是有用的;对我而言,这只是另一个术语。重要的是区分真正的数学定义递归方程,必须要解决。并非每个递归方程都有一个有用或有趣的解决方案;例如,虽然阶乘函数是上述FAC的解决方案,但

    唯一有用的解决方案
    x = x + 1
    

    是“底部”,可能代表“错误”或“未定义”或“分歧”。

    我认为教科书中的这一行试图区分“隐式递归”(我称之为递归方程或递归方程)和使用显式定点算子喜欢Y组合。

    对于实用的编程语言,所有这些讨论都是非常学术性的。编程语言完全设置为支持“隐式递归”,尽管explicit fixed-point combinators are also surprisingly useful

答案 1 :(得分:2)

我已经听过显式隐式递归这些术语来对比递归函数定义(显式),例如:

sum (x:xs) = x + sum xs
sum [] = 0

使用明确递归函数的函数,如foldmap,(隐式),例如:

sum xs = foldr (+) 0 xs