我想编写一个Prolog程序,将奇数长度列表的中间元素删除到另一个列表中。
例如,如果我们给出: delete_mid([1,2,3,4,5],L)
,那么它将产生答案:L = [1,2,4,5]
。
这是我的Prolog解决方案:
delMidNumber(K,L):-
len(K,N),
(N mod 2 =:= 1 ->
N1 is N//2,
nth0(N1,K,E1),
del(E1,K,L); write('List has even length'),!).
len([],0).
len([H|T],N):-
len(T,N1),
N is N1+1.
del(E,[E|T],T).
del(E,[H|T],[H|T1]):-
del(E,T,T1).
谓词delMidNumber接受两个参数:1-奇数列表。2-将被形成的新列表。该谓词首先计算列表的长度,然后检查列表的长度是否为奇数,然后将长度除以2。结果用于nth0,以得到该索引上的元素。然后我们只需使用del谓词删除那个中间数字元素。如果长度为偶数,则写入长度为偶数的消息,然后截断(停止)。
?-delMidNumber([1,3,2,4,5],L).
L = [1, 3, 4, 5]
?-delMidNumber([1,3,4,5],L).
List has even length
delMidNumber([2,3,2,4,5],L)
,你可能会发现需要改进的地方。 - DuDa