【发布时间】:2021-04-24 05:06:41
【问题描述】:
我需要编写一个 prolog 谓词 count(X,Y,D,N) 而不使用应该计算两个整数 X 和 Y 之间的元素数量的列表。但是,它应该只计算那些可以被D 整除的值。
例如,count(3,6,2,N) 应该返回 N = 2,因为 4 和 6 可以被 2 整除,但 3 和 5 不能。
【问题讨论】:
我需要编写一个 prolog 谓词 count(X,Y,D,N) 而不使用应该计算两个整数 X 和 Y 之间的元素数量的列表。但是,它应该只计算那些可以被D 整除的值。
例如,count(3,6,2,N) 应该返回 N = 2,因为 4 和 6 可以被 2 整除,但 3 和 5 不能。
【问题讨论】:
递归是你的朋友(就像大多数 Prolog 的情况一样)。
这里有一个辅助谓词,它带有一个作为累加器的附加参数:
你应该这样做:
count( X, Y, D, N ) :- count( X, Y, D, 0, N ) .
count( X , Y , D , T , N ) :- X =< Y, % If X <= Y ...
( X rem D =:= 0 % - and X is divisible by D
-> T1 is T+1 % - then increment T
; T1 = T % - otherwise don't
), % and
X1 is X+1, % - increment X
count( X1, Y, D, T1, N ). % - recurse down
count( X , Y , _ , N , N ) :- X > Y. % IF X > Y, we're done: unify the accumulator with the result.
以上是尾递归,并且针对所有意图和目的优化为迭代。更经典的递归解决方案是这样的:
count( X, Y, _, 0 ) :- X > Y .
count( X, Y, D, N ) :- X =< Y ,
X1 is X+1,
count( X1, Y, D, T ),
( 0 =:= X rem D -> N is T+1 ; N = T )
.
【讨论】: