我正在学习prolog,我必须创建一个程序,该程序返回小于给定数字的数字(在列表中)的添加。 我有这个..
minvalue
我希望例如:
numlowest
但它给了我错误。
我正在使用此https://swish.swi-prolog.org
我该怎么做才能解决这个问题?我的代码出了什么问题?
答案 0 :(得分:0)
问题来自以下事实:对于值V
,您只处理案例X<V
和X>V
而不处理案例X=V
。事实上,如果您将X>K
替换为X>=K
,您的程序将会得到结果R=8
。
让我说说你的计划的两件事:
首先,您不需要代码中的最后两行(即additionsmaller([X],K,X):-X<K.
和additionsmaller([X],K,0):-K<X.
)。只需用additionsmaller([],_,0).
第二:您还应该考虑编写一个尾递归解决方案,如下所示:
additionSmallerTail([],_,V,V).
additionSmallerTail([H|T],K,V,V0):-
H >= K,
additionSmallerTail(T,K,V,V0).
additionSmallerTail([H|T],K,V,V0):-
H < K,
V1 is V+H,
additionSmallerTail(T,K,V1,V0).
?- additionSmallerTail([1,2,3,4,2],4,0,R).
R = 8
false
为什么要使用尾递归? This link很有意思。