list - 偶数和奇数列表

标签 list prolog

我正在尝试实现一个 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 10 ,它们都不是真的。如果我有一个包含三个元素的列表并将条件更改为 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/

相关文章:

c# - 从列表 C# 中查找不同的元素

python - 列表列表 : find combinations of elements

syntax - 疯狂的 Prolog 语法

module - Prolog 有包管理器吗?

c++ - 从 C++ 中的函数返回用户定义对象列表时出错

c# - 在 WPF 应用程序中动态创建按钮列表

r - 使用 For-Loop 让列表变得更容易

file - 区别 yap 和 swi-prolog 阅读规范列表

Prolog:语句为真,IFF 对于所有结果都为真

prolog - 查看 phrase/3 翻译的标准方法?