Prolog 将列表一分为二,其中第一个的长度给定
我想创建一个函数,根据第一个列表的长度,我们将列表拆分为2。我真的停留在它的开头Prolog 将列表一分为二,其中第一个的长度给定,prolog,Prolog,我想创建一个函数,根据第一个列表的长度,我们将列表拆分为2。我真的停留在它的开头 split(L,0,[],L). 有什么想法吗?首先考虑描述你想要的结果。您可以将列表分为开始和结束,并且开始的长度应为长度 split(List, Length, Start, End) :- length(Start, Length), append(Start, End, List). 请注意,length和append的顺序将对效率产生影响。如果将append放在第一位,那么appen
split(L,0,[],L).
有什么想法吗?首先考虑描述你想要的结果。您可以将
列表
分为开始
和结束
,并且开始
的长度应为长度
split(List, Length, Start, End) :-
length(Start, Length),
append(Start, End, List).
请注意,
length
和append
的顺序将对效率产生影响。如果将append
放在第一位,那么append将把Start
与列表的前零个元素统一起来,长度检查失败,然后将Start
与第一个元素统一起来,然后是前两个,然后是三个,依此类推,直到它到达长度为length
的前缀List
。通过将长度
目标放在第一位,可以避免所有这些明显的死胡同,这将从正确大小的列表开始 首先考虑描述你想要的结果。您可以将列表
分为开始
和结束
,并且开始
的长度应为长度
split(List, Length, Start, End) :-
length(Start, Length),
append(Start, End, List).
请注意,length
和append
的顺序将对效率产生影响。如果将append
放在第一位,那么append将把Start
与列表的前零个元素统一起来,长度检查失败,然后将Start
与第一个元素统一起来,然后是前两个,然后是三个,依此类推,直到它到达长度为length
的前缀List
。通过将长度
目标放在第一位,可以避免所有这些明显的死胡同,这将从正确大小的列表开始 使用长度/2和附加/3!(我参考先前的评论)。递归解决方案很好,但是使用length和append更容易。使用length/2和append/3优雅!(我参考先前的评论)。递归解决方案很好,但是使用长度和附加更容易。不错,但是交换这两个目标不是更好吗?@false肯定会。我将交换这些,并解释为什么一种方法更好。感谢您指出这一点。现在,目标终止,iffLength
已知。也就是说,没有必要知道其他三个中的任何一个!相反,如果append/3
是第一个目标,那么终止就更复杂了:必须知道List
或Start
的长度,而且,还有一些更奇特的情况,比如List=[a | | uu],Start=[b | |
终止,但交换这两个进球不是更好吗?@这肯定是错的。我将交换这些,并解释为什么一种方法更好。感谢您指出这一点。现在,目标终止,iffLength
已知。也就是说,没有必要知道其他三个中的任何一个!相反,如果append/3
是第一个目标,那么终止就更复杂了:必须知道List
或Start
的长度——而且,还有一些更奇特的情况,比如List=[a | | uu],Start=[b | |]
终止。