在Prolog使用递归来检查递归数据结构的元素,列表是。 模式匹配允许选择适用的正确规则。你有一个list = [X | Xs],对于每个元素X,如果是奇数(X),返回countOdds(Xs)+1 else返回countOdds(Xs)。
countOdds([], 0).
countOdds([X|Xs], C) :-
odd(X),
!, % this cut is required, as rightly evidenced by Alexander Serebrenik
countOdds(Xs, Cs),
C is Cs + 1.
countOdds([_|Xs], Cs) :-
countOdds(Xs, Cs).
注意if
,与具有same
模式不同的规则处理:在序言找到一个非奇的元素,它退回到最后一个规则。
ISO Prolog的有If Then Else
语法糖,但你可以写
countOdds([], 0).
countOdds([X|Xs], C) :-
countOdds(Xs, Cs),
( odd(X)
-> C is Cs + 1
; C is Cs
).
在第一个版本中,递归调用如下测试odd(X)
,避免list'tail的无用的访问应该被重复在回溯。
编辑没有晋级,我们得到的多个执行路径,并在“所有解决方案”,因此可能不正确的结果谓词(的findall,SETOF,等...)
这最后的版本放在证据表明,程序不是tail recursive
。为了得到一个尾递归程序添加accumulator
:很多
countOdds(L, C) :- countOdds(L, 0, C).
countOdds([], A, A).
countOdds([X|Xs], A, Cs) :-
( odd(X)
-> A1 is A + 1
; A1 is A
),
countOdds(Xs, A1, Cs).
感谢,真的帮了我对这个问题以及其他问题,我不得不:) – user1204349 2012-04-19 07:33:46