在網上搜來的用fun在shell中寫遞歸的帖子,偶然發(fā)現(xiàn)下貼
大神原貼http://www.cnblogs.com/me-sa/archive/2012/04/28/2474892.html
貼中認為N*F(N-1)為尾遞歸,但我認為存在副作用,不應該算作尾遞歸
也可能是我對fun的理解有限…
因為原貼使用了數(shù)學理論,看起來不太親民,拼了一天把原理弄通了(編程層面,不是底層執(zhí)行層面)不知道是否有為此困擾的小伙伴,所以分享一下,不喜勿噴
shell中輸入
y(M) ->
? ?G = fun (F) -> M(fun(A) -> (F(F))(A) end) end,
? ?G(G).
Fac = fun (F) ->
? ?fun (0) -> 1;
? ?(N) -> N * F(N-1)
? ?end
? ? ? ?end.
(y(Fac))(5).
120
因為將Fac作為參數(shù)傳給了y,即M為Fac,而M的fun作為參數(shù)傳遞給了Fac,此處套用調用即揭開一層fun的想法,得到的結果是這樣的
shell中輸入
Fac = fun (F) ->
? ?fun (0) -> 1;
? ?(N) -> N * F(N-1)
? ?end
end.
G = fun (F) -> Fac(fun(A) -> (F(F))(A) end) end,
(G(G))(5).
120
此處我想不到什么好辦法表示Fac,在G調用Fac時Fac已經打開一層fun了
將fun(A) -> (F(F))(A) end作為參數(shù)傳遞給Fac后,和G合并成這個樣子
shell中輸入
G = fun (F) -> fun(0) -> 1;(N) -> N*(F(F))(N-1) end end.
(G(G))(5).
120
注意此處fun(A) -> (F(F))(A) end已經打開了
之后G將自己作為參數(shù)傳遞給了自己,打開了最后一層fun
此處代碼已經不能執(zhí)行了,但看到了一個有趣的調用
(G(G)) = fun(0) -> 1;(N) -> N * (G(G))(N-1) end.
將5帶進去后,有了(G(G))5 = 5*(G(G))(4)
沒錯,遞歸了