如何在递归时从列表中删除所有元素?

时间:2017-04-03 13:51:59

标签: list recursion prolog

我正在尝试编写一个谓词,它可以将任何整数列表转换为一堆“奇偶校验运行”,其中每个运行是原始列表中连续偶数或奇数的(最大)序列。

例如,列表

列表= [8,0,4,3,7,2,-1,9,9]

可分为[8,0,4],[3,7],[2]和[-1,9,9]

我要做的是递归扫描列表并将整数逐个追加到名为OldList的列表中。程序将保持附加整数,直到附加了相反极性(奇数或偶数)的数字,然后OldList将创建一个名为TinyList的新列表,其中包含1个奇偶校验运行。然后将这个单独的奇偶校验运行附加到结果输出列表上。我遇到的问题是在成功完成1个奇偶校验运行后重置OldList。我正在尝试将OldList转换为空列表,以便我可以继续进行更多奇偶校验运行,但我没有运气。有什么想法吗?

这是我的代码:

% base case
paruns([], [], []).

% recursive case
paruns([Head|Tail], OldList, RunList):-
paruns(Tail, TempList, SubList),               

% appending each integer to the OldList
append([Head], TempList, OldList),.

% returns a parity run when polarity of number changes or returns nothing
createTinyList(OldList, TinyList),

/*
Trying to reset OldList here <-------------------- but no luck :(
*/

% appends 1 parity run list into the final output list
append(TinyList, SubList, RunList).



% checks if number is odd
    odd(Num):-
    1 is Num mod 2.

% checks if number is even
    even(Num):-
    0 is Num mod 2.

% checks if the polarity of 1st and 2nd numbers are same
% returns [] if both numbers have same polarity
% if 1st and 2nd numbers have different polarity this predicate will output the whole list, excluding the 1st number with different polarity
createTinyList([Head|[]],[]).

createTinyList([Head|[MiniHead|Tail]], []):-
    odd(Head), odd(MiniHead).

createTinyList([Head|[MiniHead|Tail]], []):-
    even(Head), even(MiniHead).

createTinyList([Head|[MiniHead|Tail]], [MiniHead|Tail]):-
    odd(Head), even(MiniHead).

createTinyList([Head|[MiniHead|Tail]], [MiniHead|Tail]):-
    even(Head), odd(MiniHead).

每当我提到极性时,假设我在谈论数字的奇怪或均匀。

0 个答案:

没有答案