Prolog 序言倍数和(递归)
我正试图用Prolog解决我的家庭作业中的一些问题: 倍数之和: 例如:Prolog 序言倍数和(递归),prolog,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. 您需要将问题分为两部分: 计算一系列数字乘积
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.
您需要将问题分为两部分:
- 计算一系列数字乘积的部件,如
;及multi/2
- 计算这些乘积之和的部件,如
多维求和/2
multi/2
,您输入了一个打字错误:
multi([A|B]|G):-multi(B,Z),G is A * Z.
现在它可以工作了:
?- multi_sum([[2,3],[5,4],[3,1,2]],X).
X = 32.
不过,您可以通过使用累加器和尾部递归来提高效率:
@鲍里斯:我想他打错了:注意第二行开头的管道(
,
)而不是逗号(,
)。@WillemVanOnsem是的,那是个打字错误。多([2],R)
已经失败了。@Boris是的,谢谢!我不确定效率主张。它将在具有尾部递归优化的常量内存中发生,但我不确定它是否会更快(在许多情况下,累加器+尾部递归实际上更慢!)
?- multi_sum([[2,3],[5,4],[3,1,2]],X).
X = 32.
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).