2011-11-15 36 views
3

以下是不同語言的一些片段。語言之間遞歸處理的差異

功能double問題來自SICP,前。 1.41。

Lisp語言:

(define (double f) (lambda (x) (f (f x)))) 
(define (inc x) (+ x 1)) 
(((double (double double)) inc) 5) 

的Python:

def double(f): 
    def result(x): 
    return f(f(x)) 
    return result 

def inc(x): 
    return x + 1 

double(double(double(inc)))(5) 

的Javascript:

var double = function(f) { 
    return function(x) { return f(f(x)) }; 
}; 

var inc = function(x) { return x + 1 }; 

(double(double(double(inc))))(5); 

紅寶石:

double = lambda {|f| lambda {|x| f[f[x]] } } 
inc = lambda {|x| x+1 } 
double[double[double[inc]]][5] 

如果我不瘋狂,這些函數應該做同樣的事情並返回相同的結果。 但是,lisp版本會返回21,而其他版本會返回13.您能否向我解釋這種差異?我錯過了什麼嗎?

+0

@ MichaelJ.Barber感謝,固定。 – Mark

回答

10

如何調用方案代碼中的功能與其他方法不同。等效蟒將是:

double(double(double))(inc)(5) 

在話,該方案的代碼創建應用於另一個函數的16倍的函數,並且該函數適用於inc。 python創建了8次應用inc的函數;其他人的工作與蟒蛇一樣。

如果您爲中間步驟引入名稱,區別可能會更清晰一些。在方案:

(define quadruple (double double)) 
(define hexadecuple (double quadruple)) ; hexadecuple may not actually be a word... 
(define add16 (hexadecuple inc)) 
(add16 5) 

我希望這是正確的語法;我已經做了一些計劃,這已經有一段時間了。

在蟒蛇:

add2 = double(inc) 
add4 = double(add2) 
add8 = double(add4) 
add8(5) 
+0

確實,你是對的。 – Mark

2

爲了完整性,這裏有一個固定的Ruby版本會是什麼樣子:

double = ->f { ->x { f.(f.(x)) }} 
inc = ->x { x.succ } 

double.(double.(double)).(inc).(5)