【问题标题】:Standard ML binary tree type标准 ML 二叉树类型
【发布时间】:2012-10-04 21:18:11
【问题描述】:

我正在课堂上学习机器学习,但遇到了一个我一直坚持的家庭作业问题。昨天找了一整天,没有什么进展,课堂上也没讲这个,希望大家帮帮我。

我们得到:

datatype which = STRING of string | INT of int

第 1 部分。我们被告知需要为包含 which 类型值的二叉树创建另一个名为 whichTree 的数据类型,其中数据仅位于树的叶子上。

第 2 部分。我们需要创建一个 whichSearch 函数,其类型为 whichTree -> int -> bool,根据 int 是否在树中返回 true 或 false。

这是我目前所拥有的:

datatype which = STRING of string | INT of int;
datatype whichTree = Empty | Node of int*whichTree*whichTree;

val t1 = Node(6, Node(4,Empty,Empty), Node(15, Node(11,Empty,Empty), Node(24,Empty,Empty)));
val t2 = Node(157,Empty,Empty);
val t3 = Node(102,t1,t2);

fun whichSearch (i, Empty) = false
| whichSearch (i, Node(entry, left, right)) =
    if i = entry then true
    else whichSearch (i, left)
    orelse whichSearch (i, right);

我现在面临的问题是这样的:

  1. 我的whichTree 不包含which 类型。我不确定如何解决这个问题。
  2. 我应该拥有whichTree -> int -> bool 类型的whichSearch 函数,但它是int * whichTree -> bool,并且正在努力弄清楚如何解决问题。我不确定如何解决这个问题,因为我必须在 whichSearch 中为 i 指定一个值来搜索。我正在搜索这个,但任何提示都会很棒。

有人可以帮忙吗?如果是,谢谢!并感谢那些已经回复的人。

【问题讨论】:

    标签: types tree sml


    【解决方案1】:

    根据您的想法,我想我应该指出您正在打破的标准机器学习语言中的一些规则,我希望这些规则会让您更容易继续:

    • 您引入的每个名称,无论是类型、函数还是变量,都只能表示一件事(只要它们在程序中处于同一范围内)。

      • 您可以先定义一个数据类型which,然后用相同的名称定义一个函数,从而打破这一点。
      • 您还可以先定义一个数据类型whichTree,然后用相同的名称定义另一个数据类型来打破它。
      • 实际上,您还可以在第 3 行打破它,通过引入已经在第 1 行引入的两个新的数据类型构造函数(STRINGINT)。请记住,当您使用这些 datatype 声明时,您不仅定义了类型名称,还定义了该类型的构造函数。
    • 1234563 .

    我也同意 Victor 的观点,您应该从概念上概括地思考二叉树实际上是什么。然后将其翻译成 Standard-ML。


    在重写问题中的代码后进行编辑:您的新代码要好得多。正如您所指出的,您现在有两个问题:

    1. 如何使树成为which 值的树?好吧,您的树当前是具有int 值的树,所以您应该将int 更改为which 是否有意义?但是您还声明您的树数据类型应该是“包含“which”类型值的二叉树,其中数据仅位于树的叶子处”。这与您当前编写的代码不同,后者在每个 非叶 节点上都保留一个 int。非叶节点由数据类型声明中的递归大小写决定,而叶节点由非递归大小写决定。

    2. (A * B) -> C 类型的函数(其中 A、B 和 C 是类型)可以重写为 A -> B -> C 类型。两者在 Standard-ML 中都是有效且可用的,但第二种形式通常在函数式编程语言中更受欢迎,因为它允许一种称为 currying 的技术,这意味着“部分函数应用程序”。要进行更改,您基本上以不同的方式编写参数:您可以编写 myFunction a b,而不是 myFunction a b——在您定义函数的位置和使用它的位置。

    请注意,我建议您稍后处理第 2 点,首先专注于使数据类型正确并获得有效的搜索功能,然后您可以在知道其他方面正确时更改其类型。

    【讨论】:

    • 我在纸上重新做了一些东西,并找到了一些我使用的其他教程。我现在走在正确的轨道上。真正的问题是除了我昨天和今天学到的东西之外,我对数据类型声明知之甚少。我越来越近了,将不得不按照您的建议搜索如何定义另一种数据类型。
    • 我根据您修改后的问题扩展了我的答案。请记住,在 Stack Overflow 上,您应该为有帮助的答案投票并在最后接受答案。
    【解决方案2】:

    忘掉机器学习吧。使用笔和纸(或记号笔和白板),您能解释一下在叶子中包含您的数据的二叉树的样子吗?你能概括地解释一下你将如何在树中搜索一个元素吗? (提示:搜索需要通过决定是向左还是向右来遍历节点,因此您需要在树节点中保留一些信息以帮助搜索算法做出决定)。

    一旦您将表示和算法安排为英语句子,将它们翻译成 SML 会更容易。

    【讨论】:

    • 我遇到的问题是弄清楚如何在 ML 中创建树。我知道我的旧代码看起来很奇怪,但我在猜测。我现在走在正确的轨道上,我的代码左看右看。谢谢你的建议。希望几个小时后我能做同样的事情来纠正我的类型,然后一切都会好起来的:)
    猜你喜欢
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2017-03-07
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多