簡體   English   中英

OCaml fold_tree和令人困惑的遞歸

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM