问题描述
我正在尝试解决此问题:
定义一个函数
blendList : 'a list * 'a list -> 'a list
包含两个列表,并返回一个包含两个列表的“混合”列表,并且从两个列表中严格选择值。除
length
之外,不要使用任何内置的标准ML函数。一些例子:
blendList([1,2],[100,200,300,400]) (* Returns [ 1,100,2,400] *) blendList([200,900],[3,1]) (* Returns [ 200,3,1,900] *) blendList([],200]) (* Returns [100,200] *) blendList([1,[]) (* Returns [1,2] *)
我该怎么做?
解决方法
请考虑以下代码:
fun blendList ([],l) = l
| blendList(l,[]) = l
| blendList(a :: restA,b :: restB) = a :: b :: blendList(restA,restB);
blendList([1,2],[100,200,300,400]); (* Returns [ 1,100,2,400] *)
blendList([200,900],[3,1]); (* Returns [ 200,3,1,900] *)
blendList([],200]); (* Returns [100,200] *)
blendList([1,[]); (* Returns [1,2] *)
blendList([1,[1,2]); (* Returns [1,2] *)
我们将blendList分为3个选项:
- 第一个列表为空。
- 第二个列表为空。
- 两个都有条目。
在第一个选项中,我们获取第二个列表。在第二个选项中,我们采用第一个列表。在最后一个中,我们采用了前两个元素,并使用剩下的内容再次激活相同的方法。
请注意,如果两个列表的大小相同,它将到达最后一个调用blendList[[],[]]
,这将属于第一种情况,并返回[]
。