0

我正在自己研究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”中的参数有什么意义呢?感谢帮助。

4

2 回答 2

2

关键gcdnew在于它包含用于递归调用的函数。

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

顺便说一句:有一个轻微的错字,因为你有太多的括号 - 它可能应该是

((lambda (gcd) (gcd 12 8 gcd))
   (lambda (a b gcdnew)
     (if (= b 0)
          a
         (gcdnew b (modulo a b) gcdnew))))
于 2013-04-24T14:29:41.943 回答
0

这被称为 Y 组合器。

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

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

于 2013-05-10T12:39:15.190 回答