與f#戰鬥 - 戰鬥是在樹的領域 - 專門計算節點的數量。這真是令人感興趣,因爲我希望最終在F#中編寫代碼的程序涉及多路樹,不幸的是它已經開始了一些麻煩的開始 - 我希望你能夠幫助!計算樹中的節點
99 f#系列中的問題61,要求計算二叉樹的葉子。該解決方案(如下)計算節點,但我的問題是不理解
雙遞歸是如何工作的環左(LACC樂趣 - >循環的權利..)
什麼
cont (branchF x lacc racc)
是,我印象是續是「ABC」的功能,但這種只需要兩個參數...loop t id
id爲單位類型 - 我不明白這是怎麼暗示
基本上不理解這一點,或者它在樹中流動的順序(調試&步驟沒有證明有用)如果有更簡單的例子,預讀的建議等,那麼請指導我。
任何幫助非常感謝,問題的解決方案代碼如下:
乾杯
TD
type 'a Tree = Empty | Branch of 'a * 'a Tree * 'a Tree
let foldTree branchF emptyV t =
let rec loop t cont =
match t with
| Empty ->
cont emptyV
| Branch (x, left, right) ->
loop left (fun lacc ->
loop right (fun racc ->
cont (branchF x lacc racc)))
loop t id
let counLeaves tree =
foldTree (fun abc lc rc ->
if lc + rc = 0 then 1
else 1 + lc + rc) 0 tree
let Tree1 = Branch ('x', Branch ('x', Empty, Empty),Branch ('x', Empty, Branch ('x', Empty, Branch ('x', Empty, Empty))))
let result = counLeaves Tree1
我不知道我在寫什麼解決方案時想的是什麼,但是Lee很害怕,而counvaves中的「if」沒有做任何事情。解決辦法應該是讓countraves tree = tree |> foldTree(fun_lc rc - > 1 + lc + rc)0.如果你想知道更多關於摺疊和延續的知識。我在這裏推薦Brian McNamara在Catamorphisms上的系列文章[鏈接](http://lorgonblog.wordpress.com/2008/04/05/catamorphisms-part-one/)。那是我得到fodlTree功能的地方。 – 2013-02-28 21:32:21
嗨塞薩爾,只是想說謝謝你發佈了99個問題系列 - 真的很棒的學習工具 - 特別是多種解決方案。乾杯! – dusiod 2013-03-05 19:22:37
鑑於沒有人回答你關於id的問題,「id」是身份運算符。你可以用(fun x - > x)替換id來獲得同樣的效果。看到這裏:http://msdn.microsoft.com/en-us/library/ee353607.aspx此外,這個代碼有一些可怕的錯誤 - 我創建了一個簡單的4節點樹,它告訴我的大小是32!一旦我找出所有的細微差別,我會發佈一個正確的實現(我正在工作)。 – 2014-01-13 01:23:24