【问题标题】:SML binary tree reduce functionSML二叉树归约函数
【发布时间】:2011-06-28 19:34:49
【问题描述】:

所以我有一个 SML 任务,我需要一些帮助才能开始。

问题是这样的

编写一个'a btree -> int类型的函数btree_size,它返回 二叉树的大小。 (二叉树的大小是 二叉树中的元素)。例如,btree_size (Node (Leaf, 1, Node (Leaf, 2, Leaf))) 应该返回 2。您的函数必须使用 提供了 btree_reduce 函数,最多 3 行。

btree_reduce 函数是这样的

(* A reduction function. *)
     (* btree_reduce : ('b * 'a * 'b -> 'b) -> 'b -> 'a tree -> 'b) *)
    fun btree_reduce f b bt =
      case bt of
      Leaf => b
      | Node (l, x, r) => f (btree_reduce f b l, x, btree_reduce f b r)

到底如何创建一个 btree_size 函数,它接受一个 btree 并使用 reduce 函数来给我树的大小?

【问题讨论】:

    标签: tree binary-tree sml reduce


    【解决方案1】:

    由于这是作业,我将避免直接回答。 :)

    我会按照以下方式进行:

    • 熟悉计算树的大小(通过编写符合您的规范的递归函数)
    • 查看您编写的函数和 btree_reduce 之间的共同点(或者,可以从您编写的函数中抽象出什么)

    当然,这是众多方法之一。

    【讨论】:

    • 是的,递归函数是轻而易举的事。 fun btree_size bt = case bt of Leaf=>0 |Node(btl, x, brt)=> btree_size btl + 1 + btree_size btr 我不知道如何告诉reduce函数每次加1。我知道我们要做这样的事情 reduce("tell it to add", 0, bt) 我只是不知道如何告诉它每次都添加一个
    • 我想你已经明白了。您传递给 btree_reduce 的函数 f 需要 3 个参数。第一个参数和第三个参数是两个递归调用的结果,对吧?在 btree_size 的归纳情况下,结果具有 x + 1 + y 的形式,其中 x = btree_size btl 和 y = btree_size btr。您需要更多提示吗?
    • 是的,我明白这一点。我不知道如何创建一个函数来传递给 reduce 来告诉它这样做。我尝试过的所有内容都没有编译。我是否需要创建一个外部辅助函数,或者是否有一些内置的 SML 功能可以做到这一点?
    • 刚刚试过这个。 fun myAdder a b c = 1 + a + c;有趣的 btree_size bt = btree_reduce(myAdder, 0, bt);它爆炸了
    • 所以你被语法绊倒了,对吗?您是否尝试过 fn (x, a, y) => ...?顺便说一句,有一个有用的关键字“local”可以用作“由内而外的让”。
    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2019-09-09
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多