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

标签 recursion prolog counter 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).

在第一个示例中,我在递归之前使用了计数器,但在第二个示例中,我在递归之后使用了它。我这样做的原因是所谓的试试看,因为我真的不明白为什么有时在之前,有时在之后......

最佳答案

简短回答:您可以放置​​这样的算术关系 两者 之前和之后。至少,如果您使用约束代替 (is)/2 .唯一的区别可能在于终止和错误。

因此,让我们看看如何使用约束定义谓词:

:- use_module(library(clpfd)).

nXList(0,_,[]).
nXList(N,X,[X|T]):-
    N #> 0,
    N1 #= N-1,
    nXList(N1,X,T).

media([], 0, 0).
media([X|L], N, Soma):-
   N #> 0,
   N #= N1 + 1,
   Soma #= Soma1 + X,
   media(L, N1, Soma1).

您现在可以以更通用的方式使用这些定义,例如:
?- nXList(3, X, T).
T = [X, X, X] ;
false.

?- media(Xs, 3, S).
Xs = [_A, _B, _C],
_D+_A#=S,
_C+_B#=_D ;
false.

... nXList/3可以更简洁地表示为:
..., length(T, N), maplist(=(X), T), ...

关于recursion - Prolog 中的递归搜索、累加器和计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42190905/

相关文章:

prolog - 取决于未能在序言中证明

python - 根据可能值列表计算列表中的元素

javascript - React 计数器不增加,而是加 1

redis - 在 Redis 中设置计数器的预定义范围

haskell - 为什么所有递归模式同义词都被拒绝?

Python无限递归打印所有子项

math - 序言中的除法

python - 在 Python 中使用递归元组的 Pascal 三角形

c++ - 如何在递归函数中使用迭代器

list - 比较序言中的列表