这段代码中的递归在哪里?

时间:2013-04-24 14:08:56

标签: recursion scheme

我自己在学习Scheme,最近我遇到了这段代码:

((lambda (gcd) (gcd (12 8 gcd))
    (lambda(a b gcdnew)
        (if (= b 0)
        a
        (gcdnew b (modulo a b) gcdnew))))

作者说这个有一个递归。这是一个古老的话题,所以我无法联系他。那么它在哪里(=递归)?似乎第二个'lambda'作为值第一个'gcd',所以我们的身体实际上是:

(gcdnew 8 4 gcdnew) 

嗯,'gcdnew'作为'gcdnew'中的参数有什么意义?谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

gcdnew的意思是它保存了用于递归调用的函数。

外部lambda通过获取函数(gcd)并将其应用于12和8,并将相同函数作为第三个参数传递来设置递归。
在内部函数内部,gcdnew引用内部函数本身,它使用gcdnew递归调用自身,确保在递归中传递它(即它本身)。

顺便说一句:有一个小错误,你有太多的括号 - 它应该是

((lambda (gcd) (gcd 12 8 gcd))
   (lambda (a b gcdnew)
     (if (= b 0)
          a
         (gcdnew b (modulo a b) gcdnew))))

答案 1 :(得分:0)

这被称为Y组合子。

实际上,它可以用不支持显式递归的语言进行递归。 (实际上你甚至不需要递归地定义它)

http://mvanier.livejournal.com/2700.html