Prolog总和倍数(递归)

时间:2017-01-10 10:47:14

标签: prolog

我正试图解决我在Prolog的家庭工作中遇到的一些问题: 倍数之和:

例如:

multi_sum([[2,3],[5,4],[3,1,2]],X).

应该返回:X = 32。但我得到了结果:false

multi([],1).
multi([A|B]|G):-multi(B,Z),G is A * Z.

multi_sum([],0).
multi_sum([A|B],Q):- multi(A,M) , multi_sum(B,T), Q is T + M.

1 个答案:

答案 0 :(得分:1)

您需要将问题分为两部分:

  • 计算像multi/2这样的数字列表的乘积的部分;和
  • 计算这些产品总和的部分,例如multi_sum/2

对于你的multi/2,你写了一个拼写错误:

multi([A|B]|G):-multi(B,Z),G is A * Z.

第二个管道(|)应该是逗号(,):

multi([A|B],G):-multi(B,Z),G is A * Z.

现在可行:

?- multi_sum([[2,3],[5,4],[3,1,2]],X).
X = 32.

尽管如此,您可以使用 accumulators 尾递归来提高效率:

multi(L,R) :-
    multi(L,1,R).

multi([],R,R).
multi([A|B],S,R) :-
    T is S*A,
    multi(B,T,R).

multi_sum(L,R) :-
    multi_sum(L,0,R).

multi_sum([],R,R).
multi_sum([A|B],S,R)
    multi(A,Sub),
    T is S+Sub,
    multi_sum(B,T,R).