我正在尝试实现一个 Prolog 程序,它将一个列表分成两个列表。第一个将包含偶数位置的数字,第二个包含奇数位置的数字。
例如:even_odd([1,2,4,7,5],Even,Odd).
将导致 Even=[2,7].
和 Odd=[1,4,5].
我找到了比我在谷歌上搜索问题更优雅的解决方案,但是我想在我的代码中找到问题所在(可能是运算符误用),因为我真的认为我对 Prolog 运算符的理解很差(尤其是在算术比较中) .谷歌搜索只会让情况变得更糟,每个网站都有完全不同的解释。
我的代码:
even_odd([], [], []).
even_odd([H|T], Even, Odd) :-
length([H|T], X),
X mod 2 is 0,
append(Even1, H, Even),
even_odd(T, Even1, Odd).
even_odd([H|T], Even, Odd) :-
length([H|T], X),
X mod 2 is 1,
append(Odd1, H, Odd),
even_odd(T,Even,Odd1).
我试过跟踪,我知道问题出在
X mod 2 is 1
或 0
,它们都不是真的。如果我有一个包含三个元素的列表并将条件更改为 X is 3
完全没问题,但部门似乎搞砸了,所以有什么想法吗?
最佳答案
虽然 CapelliC 对您的代码失败的原因有正确的想法,但他误解了您关于想要偶数/奇数位置的问题。
问题是,你是从列表的末尾计算那些,所以 even_odd([1,2,4,7],Even,Odd).
将导致 Even=[1,4].
和 Odd=[2,7].
这不是你想要的。
一个解决方案是在处理之前反转列表并在之后反转结果,或者采取不同的方法。
在这里,我们首先将第一个元素添加到奇数列表,然后在添加到偶数和奇数列表之间交替,直到我们到达最后一个元素。
even_odd(List, Even, Odd) :-
% First position is odd
even_odd_odd(List, Even, Odd).
% We handle the odd position, the next is even
even_odd_odd([H|T], Even, [H|Odd]) :-
even_odd_even(T, Even, Odd).
even_odd_odd([], [], []).
% We handle the even position; the next is odd
even_odd_even([H|T], [H|Even], Odd) :-
even_odd_odd(T, Even, Odd).
even_odd_even([], [], []).
关于list - 偶数和奇数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21182239/