2013-02-07 28 views
1

使用加倍功能

(define (double fn) (lambda (x) (fn (fn x)))) 

你能解釋

((((double double) double) 1+) 0) 

怎麼等於16?它如何使用替代工作?

回答

1

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添加到您傳遞給它的任何參數。

0

它如何使用替代工作?

如果您使用的是Racket,則可以在「Intermediate lambda」中級學生語言中使用DrRacket的步進工具來查看確切的替代步驟。