我正在尝试使用列表创建一个函数数组,并使用问题中的给定函数。 正式来说,任务是从列表中创建一个功能数组,索引从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
在左边创建一个新的分支,如果n mod 2 = 1
和n是奇数,那么我在右边创建一个新分支。但是,如果我这样做,那么我不知道在分支的左侧或右侧放置什么。例如,我可以调用类似
if n mod 2 = 0 then Branch(a, functionalarray(n div 2, r), ...
但我不会使用addnode而且我不知道我应该把它放在分支的右边。
非常非常感谢任何帮助......
答案 0 :(得分:0)
addnode
函数在树的最左边位置插入一个新元素,即作为它所代表的数组的第一个元素。通过这样做,所有现有元素在结果数组中有效地向上移动一个索引。因此,您需要做的就是从右到左迭代输入列表,并为每个元素应用addnode
,从空数组开始。提示:这是一个List.foldr
的单行。
当然,这个问题很奇怪,因为这种方法不可避免地会产生一个退化的树,它可以得到不平衡的树,因此没有比使用普通列表来表示数组更有效。