我正在尝试合并列表中的元素,规则如下:
1. 合并一个列表,如果列表中有2个连续的数字是相同的,则通过将它们相加来将它们合并为一个数字(例如:[4,4,0,0] -> [8,0,0,0])。
2. 新合并的数块不能在同一回合中与另一个数块结合(例如:[4,4,8,0] -> [8,8,0,0] True,但 [16,0,0,0] False)。
3. 列表长度应为4。如果在合并后列表缩短,则在尾部添加一个零(例如:[4,4,0,2] -> [8,0,2,0])。
4. 注意零的情况:[0,0,2,2] -> [0,4,0,0]。
我已经能够创建代码,但我想找到详细解释的更简单的方法。
我的方法:
merge([H|T],L):-
merge2([H|T],J),
(
length(J,2)->
append(J,[0,0],L);
length(J,3)->
append(J,[0],L);length(J,4)-> J=L).
merge2(_,[]).
merge2([X],[X|_]).
merge2([H1,H2|T],[W|L]):-
H1=H2,
W is H1+H2,
merge2(T,L).
merge2([H1,H2|T],[H1|L]):-
H1\=H2,
merge2([H2|T],L).
{....}
表示“执行转换”,而[ A, ...[B] ]
是列表拼接伪代码,代表此处的[A|B]
。 - Will Ness