erlang用fun在shell中編寫遞歸

在網上搜來的用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)

沒錯,遞歸了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容