【发布时间】:2018-04-09 09:41:00
【问题描述】:
我正在尝试使用列表创建一个函数数组,其中包含来自问题的给定函数。 正式的任务是从索引从 1 开始的列表创建一个函数数组。
但是,我在这个任务中卡住了好几天,没有任何进展。希望得到一些提示来完成这项工作..
这是我所做的:
datatype 'a tree = Leaf
| Branch of 'a * 'a tree * 'a tree
fun addnode a Leaf = Branch (a, Leaf, Leaf)
| addnode a (Branch (b, tree1, tree2)) = Branch (a, addnode b tree2, tree1);
fun functionalarray (0, a) = Leaf
| functionalarray(n, a::b::r) = Branch(a, functionalarray(n div 2, r), functionalarray(n-1 div 2, b::r));
其中addnode 是问题中的给定函数。但我想不出一种方法来使用这个功能。另外,我不知道为什么我的解决方案不起作用....
我想如果我必须使用给定的函数,我需要执行 n mod 2 这样如果 n 是偶数,那么我需要递归调用 functionalarray 在左侧创建一个新分支,如果 @ 987654326@ 和 n 是奇数,然后我在右侧创建一个新分支。但是,如果我这样做,那么我不知道在分支的左侧或右侧放置什么。例如,我可以调用类似
if n mod 2 = 0 then Branch(a, functionalarray(n div 2, r), ...
但我不会使用 addnode 并且我不知道应该在分支的右侧放置什么。
任何帮助都非常非常感谢......
【问题讨论】:
-
addnode的定义对我来说似乎很奇怪。您多次提到“问题”;我认为这是一个家庭作业问题?可以发完整篇吗? -
问题描述其实很短,我用粗体写的。我还添加了二叉树的定义以澄清
addnode的存在。 -
我不明白。您说“
addnode是问题中的给定函数”;但问题描述并没有说明什么。我错过了什么? -
问题没有指定您必须使用该功能,但它说使用此功能有一个优雅的解决方案。我做了进一步的研究,发现这实际上是一个布劳恩树结构,它显然具有 O(n) 时间复杂度的“优雅解决方案”,但我无法理解伪代码,因为 ML 使用链表(对于记录,我真的不明白
foldr等是什么):eecs.northwestern.edu/~robby/courses/395-495-2013-fall/… -
回复:“[问题] 说使用此功能有一个优雅的解决方案”:嗯?您说整个问题描述是“正式地,任务是从索引从 1 开始的列表中创建一个函数数组。”其中哪一部分说明了此功能或优雅的解决方案?
标签: arrays recursion functional-programming binary-tree sml