【发布时间】:2023-04-10 18:27:01
【问题描述】:
我正在尝试将 Prolog 中的列表分成 3 个相等的部分(...嗯,尽可能相等)。 我的算法如下:
- 找出初始列表的大小。
- 使用两个额外参数调用该过程(列表的大小和一个计数器,它会告诉我何时应该停止向一个列表添加元素并开始向另一个列表添加元素)
过程如下:
有4个参数:
div3(InitialList,FirstNewList,SecondNewList,ThirdNewList).
带有 2 个额外参数:
div3(InitialList,FirstList,SecondList,ThirdList,InitialListSize,Counter).
这是我的代码:
div3([],[],[],[]).
div3([X],[X],[],[]).
div3([X,Y],[X],[Y],[]).
div3([X,Y,Z],[X],[Y],[Z]).
div3([X | Y],A,B,C) :- length([X | Y],Sz),
Sz1 is 0,
div3([X | Y],A,B,C,Sz,Sz1).
div3([X | Y],A,B,C,Sz,Sz1) :- Sz1 < Sz//3, % am I done adding to the 1st list?
append(X,L,A), % add to the 1st list
Sz2 is Sz1+1, % increment the counter
div3(Y,L,B,C,Sz,Sz2),!.
div3([X | Y],A,B,C,Sz,Sz1) :- Sz1 < 2*Sz//3, % am I done adding to the 2nd list?
append(X,L,B), % add to the 2nd list
Sz2 is Sz1+1, % increment the counter
div3(Y,A,L,C,Sz,Sz2),!.
div3([X | Y],A,B,C,Sz,Sz1) :- Sz1 < Sz, % am I done adding to the 3rd list?
append(X,L,C),% add to the 3rd list
Sz2 is Sz1+1, % increment the counter
div3(Y,A,B,L,Sz,Sz2),!.
【问题讨论】: