【问题标题】:addition of numbers, in a list, that are smaller than a given number在列表中添加小于给定数字的数字
【发布时间】:2018-04-24 20:15:36
【问题描述】:

我正在研究序言,我必须创建一个程序来返回小于给定数字的数字(在列表中)的加法。 我有这个..

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

我能做些什么来解决这个问题?我的代码有什么问题?

【问题讨论】:

    标签: list prolog addition


    【解决方案1】:

    问题在于,对于值V,您只处理X&lt;VX&gt;V 的情况,而不是X=V 的情况。实际上,如果将X&gt;K 替换为X&gt;=K,您的程序将给出R=8 的结果。

    让我对你的程序说两点:

    首先,您不需要代码中的最后两行(即additionsmaller([X],K,X):-X&lt;K.additionsmaller([X],K,0):-K&lt;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 很有趣。

    【讨论】:

      猜你喜欢
      • 2015-11-22
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 2014-01-23
      相关资源
      最近更新 更多