[英]Max Value of a Multiway Tree in OCaml
我是一名IT學生,也是OCaml的新手
最近,在考試中我找到了這個練習。
給定:鍵入'a tree =樹'a''樹列表
定義一個函數mtree:'a tree - >'a,它返回多路樹中所有節點的最大值,遵循OCaml中的通常順序關系(<=)
我下面會做這樣的事情,當然,這是行不通的。
let rec mtree (Tree (r, sub)) =
let max_node (Tree(a, l1)) (Tree(b, l2)) =
if a >= b then (Tree(a, l1)) else (Tree(b, l2)) in
List.fold_left max_node r sub;;
在閱讀完答案之后,我發布了固定代碼。
let rec mtree (Tree(r,sub)) =
let max_node (Tree(a, l1)) (Tree(b, l2)) =
if a >= b then a else b in
List.fold_left (max_node) r (List.map mtree sub);;
這個想法是相同的,折疊列表比較使用我的本地函數的節點,並通過在連續級別的節點列表上調用函數本身來遍歷樹。
但是仍然無法正常工作。 現在抱怨fold_left部分中的max_node。
Error: This expression has type 'a tree -> 'a tree -> 'a
but an expression was expected of type 'a tree -> 'a tree -> 'a tree
在這里,我肯定迷失了,因為我無法理解為什么它希望返回一棵樹
這段代碼非常可靠(恕我直言)。 缺少的關鍵是它不會遍歷子樹的子樹。 請注意,您將函數定義為遞歸(這是非常合理的),但它從不調用自身。
需要指出的另一個問題是問題語句從樹中調用“值”,但是您的代碼返回整個樹節點。
回答我自己的問題有點蹩腳但是在這里收到的提示我可以完成它我將我的代碼留在這里面對任何面臨類似問題的人。
let maxt (Tree(r,b)) =
let rec aux (Tree(r,b)) =
match b with
[] -> [r]
|l -> [r]@( List.fold_right (@) (List.map aux b) [])
in List.fold_left max r (aux (Tree(r,b)));;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.