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

我在Wallis产品上的python代码有什么问题?,python,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

所以,我被要求对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

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

range(2, 2*n+2, 2)
或者,您可以将复杂性移动到公式中,即:

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

代码的问题是,
count
等于等式中的
2*n
,因此在
(count**2/((count-1)*(count+1))
中,
count**2
(2*n)**2
相同,但是下面的
count-1
应该与
n-1
相同,但实际上是
(2*n)-1
。这同样适用于
count+1

我制作了我自己的版本,这应该会对你有所帮助(尽管我使用了另一个等式,它是在)


随着
限制越来越高,它会收敛到接近半π。

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

对于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] 含义不包括停止

这里的
步骤
2
,您可以使用

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

如果你愿意。

对不起,我真的不知道。给出的公式是(2*2)/(3*5)*(4*4)/(5*7)*(6*6)/(7*9)等等,直到((n*2)**2)/((n-1)*(n+1))我对这个网站有点陌生,对不起,这不应该是
范围(2,2*n+2,2)
。顺便说一句,
count*count
count**2
快。FWIW,我得到
2*Wallis(1000000)==3.141591868192167
return result*2