Prolog递归定义求助:实现计算列表元素乘积的prod(L,N)谓词
Prolog递归实现乘积谓词
prod(L, N) 嘿,我懂你已经搞定求和谓词的实现了,其实乘积谓词的思路几乎一模一样,只是基准情况需要调整——这大概率就是你卡壳的点!
咱们先回忆下求和谓词的逻辑:空列表的和是加法单位元0,递归时把当前元素加到剩余列表的和上。那乘积对应的,空列表的乘积应该是乘法单位元1(因为任何数乘1都不会改变它的值),而不是0(要是用0的话,不管列表里有啥元素,最终乘积都会变成0,完全不对)。
完整的递归定义
% 基准情况:空列表的乘积为1(乘法单位元) prod([], 1). % 递归情况:取列表首元素X,先计算剩余列表L的乘积N1,再将N1与X相乘得到最终乘积N prod([X|L], N) :- prod(L, N1), N is N1 * X.
测试示例
你可以试试这些查询验证效果:
- 查询
prod([2,3,4], N).→ 返回N = 24 - 查询
prod([], N).→ 返回N = 1 - 查询
prod([5], N).→ 返回N = 5 - 查询
prod([-2, 3, -4], N).→ 返回N = 24
关键逻辑说明
为什么基准情况是1而不是0?
乘法的单位元是1,就像加法的单位元是0一样。如果把空列表的乘积设为0,那所有非空列表的乘积都会被0“污染”,比如
prod([2,3], N)会递归计算为0 * 3 * 2 = 0,这显然不符合乘积的定义。
内容的提问来源于stack exchange,提问作者Jamie Watts
相关产品推荐
相关产品推荐

