递归追加:每个列表减少一个成员并返回我们想要合并的许多整数列表
我寻找这个结果: [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).
答案 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]那样的结果...... ],你可以像我上面解释的那样扁平化。