树木Ocaml的奇怪功能

时间:2016-11-13 22:31:25

标签: algorithm tree functional-programming ocaml fold

如果节点的值大于任何其他节点的值,则该节点称为漂亮节点,该节点可以在到根节点的路上找到。问题是计算给定树上的漂亮节点。

这是问题的解决方案,但我无法理解拥有函数累加器背后的想法。

有人可以解释这个解决方案吗?

open List;;
type 'a tree = Node of 'a * 'a tree list

let rec fold_tree f (Node (x,l)) =f x (map (fold_tree f) l);;

let beautiful_nodes t  =
   let merge x l k =
            if x <k then 
                  fold_left (fun a h ->a + h k) 0 l
            else
                  fold_left (fun a h ->a + h x) 0 l + 1
            in
   fold_tree merge t (-1);;

2 个答案:

答案 0 :(得分:1)

对于所有整数k,函数“fold_tree merge t k”返回t中漂亮节点的数量,其值大于k。我们称之为假设H(t)。

(请注意,如果您认为所有值均为正值,则“fold_tree merge -1”将返回漂亮节点的数量(或“fold_tree merge 0”!)。)

根据定义,以下伪代码方程成立:

package

现在你应该能够说服自己,如果H(son1),H(son2),...持有,那么H(Node(x,[son1; son2; ...]))也会成立。< / p>

有两种情况:

  1. x&lt; k,那么值大于k的Node(x,[son1; son2; ...])中的漂亮节点正好是son1,son2,...中大于k的值的漂亮节点(因为根不是大于x)。
  2. x&gt; = k,那么值大于k的Node(x,[son1; son2; ...])中的漂亮节点是:

    • 根(根总是很漂亮),
    • son1,son2,......中的美丽节点,其值大于x。
  3. 所以通过induction on the size of trees,H(t)对于所有t都是正确的。

答案 1 :(得分:0)

以下解释可能也很有用。我的意思是相同代码的以下表示,其中明确地定义了累积的函数。 它帮助我理解了实施背后的想法。

let beautiful_nodes tree = 
   let merge x l = (fun k ->
    if (x>k) then
        1+ fold_left (fun acc h -> acc+ h x) 0 l
    else
        fold_left (fun acc h  -> acc + h k) 0 l
                    ) 
    in  fold_tree merge tree (-1);;