热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

如何在Prolog中做"平均"?

如何解决《如何在Prolog中做"平均"?》经验,为你挑选了1个好方法。

我试图在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> lambda.xy.x..:

让我们看一下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.

而且,它比原始方法更有效!


在粗略阅读(=估计你的答案的字符数),你的阐述缺乏严谨 - [见这](https://mathoverflow.net/a/14357/105336)如何做到这一点
推荐阅读
author-avatar
mobiledu2502898013
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有