在列表中添加小于给定数字的数字
addition of numbers, in a list, that are smaller than a given number
我正在学习序言,我必须创建一个程序,returns 添加小于给定数字的数字(在列表中)。
我有这个..
additionsmaller([X|XS],K,R):-X>K, additionsmaller(XS,K,R).
additionsmaller([X|XS],K,R):-X<K, additionsmaller(XS,K,T), R is T + X.
additionsmaller([X],K,X):-X<K.
additionsmaller([X],K,0):-K<X.
我希望例如:
additionsmaller([1,2,3,4,2],4,R).
R=8
但它给了我错误。
我正在使用这个https://swish.swi-prolog.org
我该怎么做才能解决这个问题?我的代码有什么问题?
问题在于,对于值 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 很有趣。
我正在学习序言,我必须创建一个程序,returns 添加小于给定数字的数字(在列表中)。 我有这个..
additionsmaller([X|XS],K,R):-X>K, additionsmaller(XS,K,R).
additionsmaller([X|XS],K,R):-X<K, additionsmaller(XS,K,T), R is T + X.
additionsmaller([X],K,X):-X<K.
additionsmaller([X],K,0):-K<X.
我希望例如:
additionsmaller([1,2,3,4,2],4,R).
R=8
但它给了我错误。
我正在使用这个https://swish.swi-prolog.org
我该怎么做才能解决这个问题?我的代码有什么问题?
问题在于,对于值 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 很有趣。