【问题标题】:Binarysearch in smlsml 中的二进制搜索
【发布时间】:2017-08-10 08:31:01
【问题描述】:
datatype 'a tree= Leaf of 'a | Node of 'a tree * 'a * 'a tree

 fun binSearch (Node(left,n,right)) x =
    if x > n then false  
    else if x=n then true 
    else binSearch (Node(left,n,right)) x = binSearch (right) x andalso binSearch (left) x;

我很无奈。那个代码有什么问题? 顺便说一句,它适用于:

binSearch (Node (Node (Leaf 1, 2, Leaf 3), 4, Leaf 7)) 7;

不适用于:

binSearch (Node (Node (Leaf 1, 2, Leaf 3), 4, Leaf 7)) 2;

【问题讨论】:

    标签: binary-tree sml


    【解决方案1】:

    在第一个条件中,您是说任何树中都不存在小于x 的元素。

    你忘了为空树写一个案例,这是唯一一个你知道一个值是否肯定找不到的案例:

    binSearch (Leaf n) x = n = x
    

    还有,你最后的else

    binSearch (Node(left,n,right)) x = binSearch (right) x andalso binSearch (left) x
    

    是比较binSearch (Node(left,n,right)) x是否给出与binSearch right x andalso binSearch left x相同的结果。
    也就是说,如果 x 在整棵树 它的两个子树中,或者在任何地方都找不到,则它表示在树中找到了 x

    递归应该去

    • 如果x 是节点中的值n,我们已经找到了。
      否则,
      • 如果x < n,递归到左子树,
      • 如果x > n,则递归到右子树

    实施留作练习。

    【讨论】:

      【解决方案2】:

      您对二叉树的定义并不理想,因为(例如)您无法构造具有两个元素的树。一个更灵活且通常更简单的定义是

      datatype 'a tree = Leaf | Node of 'a tree * 'a * 'a tree
      

      其中Leaf 是一棵没有元素的树。这让您可以编写非常简单的基本案例:

      fun binSearch t x =
        case t of
          Leaf => false
        | Node (left, n, right) => ...
      

      对于Node 的情况,您可能会发现根据将所需值x 与当前值n 进行比较的三种可能性来构建代码会很有帮助。

      fun binSearch t x =
        case t of
          Leaf => false
        | Node (left, n, right) =>
            case Int.compare (x, n) of
              LESS => ...
            | EQUAL => true
            | GREATER => ...
      

      剩下的交给你。

      【讨论】:

        猜你喜欢
        • 2015-04-07
        • 1970-01-01
        • 2015-05-18
        • 1970-01-01
        • 1970-01-01
        • 2014-07-10
        • 2014-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多