2013-04-24 99 views
0

我正在學習用我自己計劃和最近我遇到了這個代碼:這段代碼的遞歸在哪裏?

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

筆者說,在這一個遞歸。這是一個老話題,所以我不能聯繫他。那麼它在哪裏(=遞歸)?看來,第二個「拉姆達」成爲第一個「最大公約數」的值,使我們的身體居然是:

(gcdnew 8 4 gcdnew) 

那麼,什麼是「gcdnew」的點作爲「gcdnew」參數?感謝幫助。

+1

這是做遞歸不使用letrec一種迂迴的方式。事實上,額外的gcdnew論證是能夠實現的。 – 2013-04-24 14:24:18

回答

2

gcdnew的意義在於它包含用於遞歸調用的函數。

外層lambda通過取一個函數(gcd)並將其應用於12和8以及同樣功能作爲第三個參數傳遞來設置遞歸。
在內部函數中,gcdnew引用了內部函數本身,它通過使用gcdnew遞歸地調用自身,確保在遞歸中傳遞它(即它本身)。

BTW:有在一個輕微的錯字,你有太多的括號 - 它可能應該是

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

謝謝。我知道了。我做這件事情,以瞭解它是如何工作的: (定義AMA(拉姆達(AB gcdnew) (如果(= B 0) 一個 (gcdnew B(模AB)gcdnew))))​​ 然後我這樣做: (ama 12 8 ama) 它讓我更好地理解遞歸。 – Aladin 2013-04-24 15:00:41