我有这个代码用于将输入列表分成两半。好像没问题。
halve(List,A,B) :- halve(List,List,A,B), !.
halve(B,[],[],B).
halve(B,[_],[],B).
halve([H|T],[_,_|T2],[H|A],B) :-halve(T,T2,A,B).
好的,所以我尝试对其进行解码。开头很清楚:
“减半列表和 2 个逻辑变量”是这样的:
halve(List,A,B)
(1) 然后继续这部分:
:- halve(List,List,A,B).
这意味着,我正在从第一个列表中创建新的两个列表(列表、列表)还是什么?什么确切地代表“:-”?我猜新的列表 = 一半将是 A 和 B,对吧?
(2) 其次,拜托,我不太明白这两行:
halve(B,[],[],B).
halve(B,[_],[],B).
也许你可以用一些例子来解释一下,好吗?
(3) 好吧,我希望经过你对(1)和(2)的解释,我会自己得到最后一部分……
halve([H|T],[_,_|T2],[H|A],B) :- halve(T,T2,A,B).
非常感谢你帮助我。
好的,我们的第一个问题已经有了解决方案。长话短说,它的工作原理是这样的:
halve([1,2,3,4,5],[1,2],[3,4,5]).
->true
如果您注意到它将列表分成两半,但如果列表包含奇数个元素,则后半部分是较大的部分。
现在我想要获得的是让第一个更大。
所以我在想这个:
我要达到这个:
Halves_div([1,2,3],A,B).
A=[1,2],
B=[3].
假设我的输入是列表:[1,2,3]。所以我将从拆分列表的头部和尾部开始:[H|T]
然后我将合并H
新的空列表 - 我的第一半(A
)。之后我有 A=[1]、B=[] 和 Input=[2,3]。
对于合并,我有:
merge([],List,List).
merge([H|T],List,[H|New]) :- merge(T,List,New).
还有一件事-我需要检查第一半是否已经> =第二半,对吗?
所以这是我的想法,我希望你能帮助我的唯一一件事就是把它写在序言中。我有点困惑如何把它放在一起。
谢谢!
看来我的解决方案太复杂了,我找到了更好的东西!