一個Y不動點的傳值調用方式

Y不動點算子可以表達遞歸,用python代碼表達如下:

Y = lambda f:lambda x:(lambda x:f(x(x)))(lambda x:f(x(x)))


對於任意函數fY(f)=ff(Y(f))=fff(Y(f)),從而表示了遞歸

但是,如果直接用到python代碼中,如果採取傳值調用的話,那麼上式將無窮展開下去,直到內存耗盡,而不會實際計算函數的值

如果要採取傳值調用的話,還需要將上式改造一下:

Y2 = lambda f:(lambda x:(lambda x:f(lambda:x(x)))(lambda x:f(lambda:x(x))))(f)
用經典的fac函數測試一下:

__factor = lambda self:lambda n:1 if n== 0 else n*self()(n-1)

factor = Y2(__factor)

factor(3)
輸出爲6,完成了遞歸



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章