【问题标题】:Python program to calculate pi with the following sequence: pi = 4/1 - 4/3 + 4/5 - 4/7......etc [closed]使用以下序列计算 pi 的 Python 程序:pi = 4/1 - 4/3 + 4/5 - 4/7 ......等 [关闭]
【发布时间】:2012-11-14 06:12:45
【问题描述】:

只是停留在这个问题上,我尝试了很多方法,但这就是我目前所拥有的。不知道有什么问题。

def main(n):
    summ=0
    pipe=0
    for i in range(1, n, 4):
        x = 4/i
        summ = summ + x
    for j in range(3, n, 4):
        y = 4/j
        pipe = pipe + j
    ans = summ - pipe
    print(ans)

它给了我疯狂的数字......不明白为什么:(

【问题讨论】:

  • 您将 j 添加到管道,而不是 y
  • 在代码格式正确之前,我暂时对这个问题投了反对票
  • 谢谢大家,我现在发现这是一个愚蠢的错误,对不起。
  • 顺便说一句,下面的单行也可以做到:4 * sum((-1.)**(i//2) / i for i in range(1, 1000, 2))

标签: python function python-3.x pi fractions


【解决方案1】:
    pipe = pipe + j

应该改为添加yj 是循环变量,不是您要添加的。

【讨论】:

    【解决方案2】:

    有更易读的方式来编码你正在做的事情;这就是我将如何做到的。首先定义进程,然后定义操作。当提供数字的对象用完要提供的数字时,让函数退出。在这种情况下,您无需担心保留 pipe 变量,也无需担心制作两个不同的列表来保存正负减法。

    def pi(n):
        ''' returns approximations of pi. '''
        result = 0
        odd_numbers = xgen(1, n, 2)
        while True:
            try:
                result += 4.0/odd_numbers.next()
                result -= 4.0/odd_numbers.next()
            except StopIteration:
                break
        return result
    
    def xgen(start, stop, step):
        ''' turns an xrange into an actual generator. '''
        for i in xrange(start, stop, step):
            yield i
    

    【讨论】:

    • 您的xgen 只是写iter(xrange(whatever)) 的冗长方式吗?
    • 您也许可以证明您的“冗长”生成器是合理的,方法是让它也交替产生值的符号并将while 循环简化为仅result += 4.0/odd_numbers.next()
    • @DSM 正如你的一个班轮所证明的那样,编写这个函数有很多更优雅的方法;我发布此解决方案的原因是可能向可能不知道如何或何时使用它们的人介绍迭代器和生成器函数。在这种情况下,定义 xgen 'the longwinded way' 增加了迭代器如何工作的透明度。学习iter 函数应该在那之后,不是吗? :)
    • FWIW,我认为您正在尝试做的事情以及这样做的方法很好,但您确实应该首先回答 OP 关于他们自己的代码的问题。
    猜你喜欢
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2021-08-31
    相关资源
    最近更新 更多