递归追加:一个列表每次减少一个成员,并返回我们想要合并的许多整数列表

时间:2016-03-20 14:54:15

标签: list recursion prolog append

递归追加:每个列表减少一个成员并返回我们想要合并的许多整数列表

我寻找这个结果: [0,0,0,5,5,5,3,3,3,2,4,4]

So far I get the subsolutions :
[4,4]

**But I can not concatenate the rest of the solutions**
[2] 
[3,3,3] 
[5,5,5]
[0,0,0]

但是这个不起作用

/* Merge the subsolutions recursive. THIS IS THE ONE THAT DOES NOT WORK */
mergeB(S,[],[A]) :- block(S,A).
mergeB(S,X,[L|Tail],[Tail|A])  :- block(S,A), quitaUltimo(S,M), mergeB(M,X,Tail).

1 个答案:

答案 0 :(得分:0)

好的,所以我仍然不明白你想要完成什么,但是从你说过的点点滴滴中取出:

"接下来的想法是:从坐标列表:L = [...],我寻找这个结果:[0,0,0,5,5,5,3, 3,3,2,4,4] 到目前为止,我得到了子解:[4,4],2,[3,3,3],[5,5,5],[0,0,0]。 ...我想合并所有这些解决方案。"

似乎你试图以递归方式附加所有子列表,因此所有单独的结果将以一个结果列表结束。

如果这是正确的,你想要的实际上只是简单地称为flatten

输入数据的输出示例:

?- flatten([[4,4],[2],[3,3,3],[5,5,5],[0,0,0]],Result).
   Result = [4, 4, 2, 3, 3, 3, 5, 5, 5, 0, 0, 0]

注意:我看到您的数据也与您要完成的操作的顺序相反。如果在构建结果时无法以递归方式修复代码,那么也许您可以在reverse之后执行此操作。

所以,所有这些都放在一起:

?- reverse([[4,4],[2],[3,3,3],[5,5,5],[0,0,0]],R), flatten(R,RFlat).
   R = [[0, 0, 0], [5, 5, 5], [3, 3, 3], [2], [4, 4]],
   RFlat = [0, 0, 0, 5, 5, 5, 3, 3, 3, 2, 4, 4]

修改

一些想法:

我看到你正在获取列表的最后2个元素来处理它们,然后递归地希望继续为同一个列表执行该操作,现在只删除最后一个元素。你可以在这里采用反向列表方法,但另一种方法是:

% Gets last two elements and returns the list with last one removed
last2_and_rest([X,Y],X,Y,[X]).
last2_and_rest([H|T],X,Y,[H|A]) :- last2_and_rest(T,X,Y,A).

这样你就可以写出类似的内容:

% Base case (*)
foo([_],[]).

% Recursively calls block on last 2 elements of list and removes last elem
foo(List,[SubResult|R]) :-
    last2_and_rest(List,X,Y,Rest),
    block(X,Y,SubResult),
    foo(Rest,R).

在最后2个元素上执行块逻辑,保留与删除最后一个元素相同的列表,并递归地继续对静止列表中的每对元素执行此操作。当列表中只剩下一个元素时,我们不能再调用last2_and_rest,因为这会给出false,因此我们会相应地写出基本情况(*)。

请注意,我仍然不了解您尝试执行的逻辑,因此此代码不会考虑/ /之前/之后/对调用block / 2所发生的事情,但是您已经说过那部分是有效的,而你只是在合并子结果时遇到了麻烦。

当这段代码执行时 - 你正确地添加你的逻辑 - 你会得到像[[0,0,0],[5,5,5],[3,3,3]那样的结果...... ],你可以像我上面解释的那样扁平化。