在谷歌上长时间搜索后,我找不到明确的答案:
在 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/