我在Wallis产品上的python代码出了什么问题?

时间:2017-10-18 05:20:35

标签: python

所以,我被要求对Wallis产品进行编码,但这并不是很复杂。所以我制作了一个代码,但显然,它只适用于Wallis(1),而不是其余部分。谁能帮助我?谢谢!

def Wallis (n):
    result = 1
    for count in range(2, n+2, 2):
        result = result * (count**2/((count-1)*(count+1)))
    return result

计算Wallis产品的公式

(2*2)/(3*5) * (4*4)/(5*7) * (6*6)/(7*9) and so on until ((n*2) ** 2)/ ((n-1)* (n+1))

输出

Wallis(1) = (2*2)/(3*5) = 0.267
Wallis(2) = Wallis(1) * (4*4)/(5*7) = 0.122

3 个答案:

答案 0 :(得分:0)

主要是你的范围命令错误:

range(2, 2*n+2, 2)

或者,您可以将复杂性移至公式,即:

for count in range(1, n):
    result = result * (4*count*count/((2*count-1)*(2*count+1)))

答案 1 :(得分:0)

您的代码存在的问题是,count等于2*n,因此在(count**2/((count-1)*(count+1)))中,count**2(2*n)**2相同,但是以下count-1应与n-1相同,而是(2*n)-1count+1也是如此。

我制作了自己的版本,可以帮助你(尽管我使用的是https://www.wikiwand.com/en/Wallis_product处的不同等式)

def wallis(limit):
    result = 1
    for x in range(2, limit, 2):
        result *= (x / (x - 1)) * (x / (x + 1))
    return result

limit越来越高时,它会收敛到接近半个pi。

答案 2 :(得分:0)

正如其他人所说,您的range()需要更改。

对于n = 3,

for count in range(2, n+2, 2):
    print(i)

会打印

2
4

但您也需要6

正如Python文档所说

class range(start, stop[, step]) 
  

对于正步骤,范围r的内容由公式r [i] = start + step * i确定,其中i> = 0且r [i] <1。停止。

意味着stop不包括在内。

此处step2,您可以使用

for count in range(2, 2*(n+1), 2):

取幂比乘法更昂贵。所以

count*count

优于

count**2

所以修改后的版本可能是

def Wallis(n):
    result=1
    for count in range(2, 2*(n+1), 2):
        result*=((count*count)/((count-1)*(count+1)))
    return result

请注意,Wallis返回的值只是Pi值的一半。

您可以将return语句修改为

return result*2

如果你愿意的话。