使用加倍功能
(define (double fn) (lambda (x) (fn (fn x))))
你能解釋
((((double double) double) 1+) 0)
怎麼等於16?它如何使用替代工作?
使用加倍功能
(define (double fn) (lambda (x) (fn (fn x))))
你能解釋
((((double double) double) 1+) 0)
怎麼等於16?它如何使用替代工作?
double
函數接受另一個函數(讓我們將該函數稱爲fn
)作爲參數,然後返回一個接受一個任意參數的函數。它將該參數傳遞給fn
,然後將的結果傳遞給fn
,這就是結果。
例如:
> ((double add1) 1)
3
這1呼籲add1
,返回2,然後調用add1
2這給我們的結果,3
在你的榜樣,我們加倍傳遞給本身,所以現在我們有一個程序,當給出你的1+
時,我們給它添加4(因爲我們有兩個double
's,並且每個double
調用兩個1+
's)。但後來我們通過我們的新程序另一個double
,所以我們有八個double
(兩個將被我們已經創建的double
的全部四個調用)。這八個呼叫中的每一個呼叫1+
兩次。
因此,這個新程序將調用1+
兩次,八次,無論您給它的任何參數,因此將16添加到您傳遞給它的任何參數。
它如何使用替代工作?
如果您使用的是Racket,則可以在「Intermediate lambda」中級學生語言中使用DrRacket的步進工具來查看確切的替代步驟。