gpt4 book ai didi

list - 序言误解。将列表拆分为两个列表,其中偶数位置和奇数位置。我的错误在哪里?

转载 作者:行者123 更新时间:2023-12-02 09:32:50 31 4
gpt4 key购买 nike

我正在尝试将一个列表拆分为另外两个列表。列出偶数,元素处于偶数位置,列表奇数与其他元素。我一直在网上寻找解决方案,但在我看来都像中文,我无法理解这个过程。所以这就是我一直在尝试的:

split(List,Odd,Even):-odd(List,Oddlist,Evenlist).

odd([H|T],Oddlist,Evenlist):-even(T,[H|Oddlist],Evenlist).
odd([],_,_).

even([H|T],Oddlist,Evenlist):-odd(T,Oddlist,[H|Evenlist]).
even([],_,_).

但我得到的唯一返回是 Oddlist = _7132946 Evenlist = _26997888。

我不知道我做错了什么。我会很感激任何帮助。谢谢!

最佳答案

CapelliC 的回答是完美的。只是为了解释:

当你有这样的 Prolog 子句时:

foo([H|T], [H|Z]) :-    foo(T, Z).

然后你这样调用:

?- foo([a,b,c], L).from: foo([H|  T  ], [H|Z]) with H = a, T = [b,c], L = [a|Z]call: foo([a|[b,c]], [a|Z])

然后导致递归调用:

call: foo([b,c], Z).from: foo([H|  T  ], [H|Z]) with H = b, T = [c], L = [b|Z]call: foo([b|[c]], [b|Z])

此时,您在开始时制作的列表 [a|Z] 现在是 [a|[b|Z]],即 [a,b|Z]

因此,您在作为第二个参数传递的变量中创建一个列表,并将 H 标记在列表的前面。您提供给递归调用的列表的其余部分。您将不断向列表末尾添加元素,直到第一个列表为空列表。届时,您也将结束新列表:

foo([], []).

在您的示例中,还有另一个谓词与第一个谓词相互递归:

foo([], [], []).foo([H|T], [H|F], B) :-    bar(T, F, B).bar([], [], []).bar([H|T], F, [H|B]) :-    foo(T, F, B).

当然,这会将一个列表“解压缩”为两个列表。

关于list - 序言误解。将列表拆分为两个列表,其中偶数位置和奇数位置。我的错误在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30862098/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com