任务说:数字由列表表示(例如123 = [1,2,3]),写一个谓词,增加两个这样的数字。 (例如sum([4, 5, 6], [9], [4, 6, 5])
)。
我一直在考虑如何以递归的方式表达这一点,但是当数组的大小发生变化时,让我感到震惊的是。看来,如果数组被还原,这将很简单,因此HEAD实际上是最后一个元素。因为我的问题是我的总和看起来像那样:
[4, 5, 6]
+
[9]
而不是
[4, 5, 6]
+
[9]
编写此类谓词的正确方法是什么?我需要一些指示或参考帮助...
答案 0 :(得分:1)
这是我的实施:
sum(L1,L2,OutL):-
reverse(L1,List1),reverse(L2,List2),
add_lists(List1,List2,0,List3),
reverse(List3,OutL).
add_lists([],[],0,[]).
add_lists([],[],1,[1]).
add_lists([],[H|T],C,[H1|T]):-H1 is H+C.
add_lists([H|T],[],C,[H1|T]):-H1 is H+C.
add_lists([H|T],[H1|T1],C,[H2|T2]):-NH is H1+H,
(NH > 10 -> NC is 1,H2 is NH+C-10; H2 is NH+C,NC is 0),
add_lists(T,T1,NC,T2).
我们的想法是反转列表,以便添加正确的位置并避免您提到的问题。另外,如果加法大于10,你只需保持1,即减少10。
示例:
?- sum([4, 5, 6], [9], L).
L = [4, 6, 5] ;
false.