posts - 256, comments - 1314, trackbacks - 41, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

我的基础算糟糕得可以了

Posted on 2004-09-17 20:50 FantasySoft 阅读(796) 评论(7)  编辑 收藏 所属分类: All About SoftMiscellaneous
        晚上正在津津有味地看着DirectX的文章,朋友通过MSN给我发来一个问题:
       
1 + 1/2 + 1/3 + 1/4 + ...... + 1/n怎么计算?
        看到这个问题,我愣住了,好象曾经在什么地方看到过这样的一个问题,当时还看到了解答。可是现在怎么都想不起来了。我只好很不好意思地告诉我的朋友,我不知道该怎么计算。当我回复这条信息的时候,着实有点沮丧,因为这是一个比较经典的算法问题,但是我对这个竟然一无所知。我的基础真的太糟糕了,真的应该重新去学习一下算法知识。
        后来,我用Google搜索了一下,期待能够找到解答,可是能够找到的就是:这样的数列称为Harmonic Series。以下摘录一些关于Harmonic Series的信息:       

The harmonic series is this:

1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9+...

Some infinite series sum to real numbers .These 9 terms sum to 2.829. 100 terms sum to 5.187. 1000 terms sum to 7.4854. And 1,000,000 terms sum to 14.384. Just what does the infinite series add up to? The answer to that is that the sum blows up to infinity. It gets there very slowly, doesn't it? There is actually a simple proof that it sums to infinity:

    S=1+(1/2)+(1/3+1/4)+(1/5+1/6+1/7+1/8)+(1/9+...
    Consider this series:
    T=1+(1/2)+(1/4+1/4)+(1/8+1/8+1/8+1/8)+(1/16+...
    T<S for any finite number of terms.
    T=1+1/2+1/2+1/2+... which is infinite for infinitely many terms.
    So S must also be infinite. 

It turns out that there is a relatively simple estimate of the sum of n terms:

    S(n) is approximately ln(n)+.5772156649...

It gets closer, the larger n is. The number .5772156649... is known as Euler's constant.

哪位朋友知道如何解答的,还请不吝赐教了。 //Bow

Feedback

#1楼    回复  引用  查看    

2004-09-18 16:52 by Phoenix [未注册用户]
他不是已经给出你结果了吗?
不过是个近似的结果,n小的时候差的就太多了,但如果是无穷大,那就可以认为是相等了嘛……呵呵~

#2楼    回复  引用  查看    

2004-09-18 18:42 by Fantasy Soft      
但是这只是数学上计算极限值而已,现在需要的是一个保证精度的算法,说白了就是写一个函数能够计算任意N的Harmonic Series。

#3楼    回复  引用  查看    

2004-09-19 12:28 by Howard's 学习园地      
这个级数是发散的,没有极限,级数和为正无穷
原文中给出的ln(n)+.5772156649不就是你想要的function么

#4楼    回复  引用  查看    

2004-09-19 15:59 by Fantasy Soft      
这个在单纯的数学上确实就是我想要的function,但是如果要写一个函数直接这么写是肯定不行的,假设这个函数为Harmonic(int n),那么参数是6的话,也按照ln(n)+.5772156649计算的话,这个值是有问题的。因为真正的结果是2.45。

#5楼    回复  引用  查看    

2004-09-20 00:34 by Liki [未注册用户]
什么意思?

double value ( int lastTerm) {
double sum=0;
for (int term=1; term<=lastTerm; term++) sum += 1/term;
return sum;
}

除非需要讲究效率的做法,那又另当别论。

#6楼    回复  引用  查看    

2004-09-20 01:57 by Fantasy Soft      
Liki兄,使用这个函数,如果lastTerm=6的时候,得到的结果是什么呢? 因为存在1/6和1/3的情况,如果直接就这样除,肯定得不到2.45。

#7楼    回复  引用  查看    

2004-09-23 15:35 by 享受工作,享受生活      
不知道 C#的编译器怎么优化的
public static double Fun( int lastTerm)
{
double sum=0;
for (int term=1; term<=lastTerm; term++) sum += 1/(double)term;
return sum;
}
Console.WriteLine(Fun(6)); 的时候 结果确实 是 2.45 呵呵 
不过如果单步调试的时候会发现返回是 2.4499999999999997
MicroSoft 的工程师们真是费了不少心思啊

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-10-14 18:02 编辑过
 
另存  打印
最新IT新闻:
· 56被关一月 危机的是整个视频业
· 李开复:中文搜索是谷歌战略核心
· 《星际争霸2》新图:黑暗圣堂武士Zeratul
· FriendFeed介绍
· 微软在台北发布新色鼠标产品