2014-02-06 210 views
1
def compose(f, g): 
    return lambda x:f(g(x)) 

def thrice(f): 
    return compose(f, compose(f, f)) 

add1 = lambda x: x + 1 


print(thrice(thrice)(add1)(6)) = 33 

任何人都可以向我解釋爲什麼這是33? 複合函數的哪一邊我應該開始閱讀?代碼說明

+0

你能解釋最後一行中的任務嗎? – Bach

+3

這變成了一個巨大的堆棧擴展.. –

+3

函數'三次(三次)'接受一個函數並返回合成3^3 = 27次的相同函數。因此,'三次(三次)(add1)'是一個將27加到其輸入的函數。用6返回33. – Bach

回答

1

1)在數學方面,compose(f, g) = f ∘ g

2)然後thrice(f) = f ∘ f ∘ f

3)然後T := thrice(thrice) = thrice ∘ thrice ∘ thrice

4)然後T(f) = f ∘ f ∘ f ∘ f ∘ f ∘ ...#27倍

5)然後thrice(thrice)(add1) = T(add1) = add1 ∘ add1 ∘ ...#27倍

6)然後thrice(thrice(add1))(x) = x + 27

0

三次的第一次調用(三次)reuturns一個函數。爲了這個功能,你傳遞了add1函數,結果你將再次得到一個函數。如果您將6傳遞給該函數,則結果爲33。

f1 = thrice(thrice) 
f2 = f1(add1) 
print(f2(6))