我试图在Prolog中做一个平均值的谓词,但是我遇到了一些问题,
它被称为平均值(N,X),其中N是数字,X是从1到N的平均值的结果.
我试过这样做,但它并不总是很好用:
average(1,1). average(N,X) :- K is N-1 ,K>1 , average(K,S1) , X is /(+(S1,N),N). average(N,X) :- K is N-1 ,K=:=1 , average(K,S1) , X is +(S1,N).
一些帮助 ?
让我们看一下1到n之和的一些平均值:
n = 1: 1/1 = 1 n = 2: (1+2)/2 = 3/2 n = 3: (1+2+3)/3 = 2 ...
现在在某种程度上感觉1和n之间的元素并不重要,总有1/2添加.所以我们假设(1 + ... n)/ n =(1 + n)/ 2.我们如何为一般的n证明这一点?让我们尝试归纳,即让我们展示我们可以从n = 0到n = 1进行基本步骤然后,假设我们的公式适用于任意n,我们证明公式也适用于n + 1.
基本情况:对于n = 0,我们有(1 + 1)/ 2 = 1而对于n = 1,我们有(1 + 2)/2=1.5 - 正是我们想要的.
步骤案例:我们假设(1 + ... + n)/ n =(1 + n)/ 2.我们还需要表明(1 + ... + n +(n + 1))/(n + 1)=(1+(n + 1))/ 2.我们可以将分数分成两部分:
(1+...+n+(n+1))/(n+1) = (1+...+n)/(n+1) + (n+1)/(n+1) = (1+...+n)/(n+1) + 1
现在我们需要通过(n + 1)对除法做一些事情,所以让我们以不同的方式写出分数:
(1+...+n)/(n+1) + 1 = (1+...+n)/n * (n/(n+1)) + 1
现在我们可以使用(1 + ... + n)/ n =(1 + n)/ 2的假设并简化:
(1+...+n)/n * (n/(n+1)) + 1 = (1+n)/2 * (n/(n+1)) + 1 = n/2 + 1 = (n+2)/2 = (1 + (n+1))/2
这正是我们想要的!
现在让我们制作一个程序:
avg(N,X) :- X is (1+N)/2.
它给出了预期的结果:
?- between(1,10,C), avg(C,X). C = X, X = 1 ; C = 2, X = 1.5 ; C = 3, X = 2 ; C = 4, X = 2.5 ; C = 5, X = 3 ; C = 6, X = 3.5 ; C = 7, X = 4 ; C = 8, X = 4.5 ; C = 9, X = 5 ; C = 10, X = 5.5.
而且,它比原始方法更有效!