Prolog中的递归搜索和累加器和计数器

Hum*_*... 5 recursion counter prolog accumulator

经过长时间的搜索谷歌我无法找到一个明确的答案:在Prolog自己做递归很容易.我的主要问题是了解放置累加器和计数器的位置.这是一个例子:

nXlist(N,X,[X|T]):-
    N \=0,
    N1 is N-1,
    nXList(N1,X,T).
nXList(0,_,[]).

media([X|L], N, Soma):-
   media(L, N1, Soma1),
   N is N1 + 1,
   Soma is Soma1 + X.
media([], 0, 0).
Run Code Online (Sandbox Code Playgroud)

在第一个例子中,我在递归之前使用了一个计数器,但在第二个例子中,我在AFTER之后使用它.我之所以做到这一点的原因是所谓的尝试并看到原因我真的无法理解为什么有时候之前,有时是之后......

Wil*_*ess 3

更新:最重要的是,如果递归调用不是最后一次,则谓词不是尾递归。因此,如果可能的话,应该避免在递归调用之后进行任何操作。请注意,用户 false答案中的两个定义都是尾递归的,这正是由于其中的算术条件都放置在递归调用之前的事实。这是非常基本的,我们必须努力明确地注意到它。


有时我们倒数,有时我们向上数。我在另一个答案中详细讨论了这一点。它谈论了累加器,之前和之后。:)

还有一种称为操作的“结合性”(例如+),其中

a+(b+(c+....)) == (a+b)+(c+...)
Run Code Online (Sandbox Code Playgroud)

这让我们可以尽早重组并(部分)计算。尽快,但不能更早。