[英]OCaml fold_tree and confusing recursion
如果有人可以幫助我理解此代碼:
let rec fold_tree f (T(x,l))=
f x (map (fold_tree f) l);;
這個怎么運作? 我的意思主要是遞歸。
如果我正在為樹編寫折疊函數,那么我將嘗試定義某種類型的類型('a -> 'b -> 'b) -> 'a tree -> b -> b
。 即,要折疊的函數將從樹節點獲取值和累加值,並產生新的累加值。 (然后,有趣的問題將是訪問節點的順序。)
在此fold_tree
,要折疊的函數具有類型('a -> 'b list -> 'b)
。 即,它采用一列累積值而不是單個值。 使用起來有點笨拙。
但是,它確實是一種時尚。 本質上,該定義在散文中說如下:對於葉子,調用函數f
並為其傳遞節點值x
和空列表。 對於非葉子,首先在所有子樹上遞歸調用自己,然后調用函數f
傳遞節點值和遞歸調用的結果列表。
我希望這有幫助。
我想您的數據類型聲明如下:
type 'a ntree = T of 'a * 'a ntree list;;
現在找出它的最佳方法是:
1-看看它的類型簽名,
val fold_tree : ('a -> 'b list -> 'b) -> 'a ntree -> 'b = <fun>
2-根據類型簽名編寫一個測試用例,
let test_rtree = T("a", [ T("b", []) ; T("c", [ T ("f", [])]) ; T("d", [])])
in fold_tree (List.fold_left (^)) test_rtree;;
- : string = "abcfd"
3-用紙鉛筆,並嘗試重現測試用例的輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.