【问题标题】:SML - function that checks if a tree datatype is valid or notSML - 检查树数据类型是否有效的函数
【发布时间】:2016-01-22 21:25:52
【问题描述】:
datatype tree = br of tree*int*tree | lf

如果左侧分支的值总是低于根,而右侧的分支总是高于根,则该树是有效的。 例如:

valid(br(br(lf,2,lf),1,lf)) = false;
valid(br (br (lf, 2, br (lf, 7, lf)), 8, lf)) = true;

我正在寻找这样的东西,除了我不知道如何将内部分支的整数与根的整数进行比较。

fun valid(lf)=true 
  | valid(br(left,x,right)) = valid(left) andalso valid(right);

编辑: 到目前为止,我已经想出了这个(但它仍然没有检查所有上节点的所有整数,只是上面的 1 个节点。它很接近但没有雪茄)

fun valid(lf)=true 
| valid(br(lf,x,lf)) = true
| valid(br(lf,x,br(left2,z,right2))) = if x<z then valid(br(left2,z,right2)) else false
| valid(br(br(left,y,right),x,lf)) = if y<x then valid(br(left,y,right)) else false
| valid(br(br(left,y,right),x,br(left2,z,right2))) = if y<x andalso x<z then valid(br(left,y,right)) andalso valid(br(left2,z,right2)) else false;

【问题讨论】:

    标签: validation types tree sml


    【解决方案1】:

    假设这是作业,我会给你一个提示而不是完整的答案。首先定义一个函数会有所帮助,可以将其称为all_nodes,它具有类型

    tree * (int -> bool) -> bool
    

    这应该是一个函数,当传递树和整数布尔函数时,如果树中的所有整数都满足谓词,则返回 true

    那么你的函数 valid 应该有 4 个(而不是 2 个)子句。要使br(left,x,right) 有效:

    1) left 必须有效

    2) 左边的所有整数节点必须满足它们 all_nodes 和适当的匿名函数进行检查

    3) 权利必须有效

    4) 右边的所有整数节点都必须 > x,这可以通过将适当的匿名函数传递给all_nodes 来再次检查

    在编辑时:上述方法可行,但由于对每个子树应用两个而不是一个递归函数,会导致一定程度的低效率。另一种方法是定义一个仅适用于br(left,x,right) 形式的树的辅​​助函数。这个辅助函数可以返回一个 bool*int*int 类型的元组,它告诉你树是否有效,以及树中的最小和最大 int。主函数将简单地处理lf 模式并调用和解释辅助函数。关键是,在关键递归步骤中,检查左侧的最大值和右侧的最小值与节点处的 int 就足够了。需要注意如何制定递归步骤,以免您在 lf 上调用帮助程序,但这当然是可行的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 2014-07-05
      • 2019-11-28
      • 1970-01-01
      相关资源
      最近更新 更多