我正试图使用列表创建一个函数数组,其中包含一个问题中的给定函数从形式上讲,任务是从索引从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));
其中CCD_ 1是来自该问题的给定函数。但是我想不出使用这个函数的方法。此外,我不知道为什么我的解决方案不起作用。。。。
我想,如果我必须使用给定的函数,我需要执行n mod 2
,这样,如果n是偶数,那么我需要递归调用functionalarray
,在左边创建一个新分支,如果n mod 2 = 1
和n是奇数,那么我在右边创建一个新分支。然而,如果我这样做,那么我不知道在分支的左侧或右侧放置什么。例如,我可以称之为
if n mod 2 = 0 then Branch(a, functionalarray(n div 2, r), ...
但我不会使用addnode,我不知道应该在分支的右边放什么。
任何帮助都将不胜感激。。。
addnode
函数在树的最左边位置插入一个新元素,即作为它所代表的数组的第一个元素。通过这样做,所有现有元素都会在结果数组中有效地上移一个索引。因此,您所需要做的就是从右到左迭代输入列表,并对每个元素应用addnode
,从一个空数组开始。提示:这是一个带有List.foldr
的单行。
当然,这个问题很奇怪,因为这种方法不可避免地会创建一个尽可能不平衡的退化树,因此并不比使用纯列表来表示数组更有效。