在上课期间,我被要求编写一个程序,该程序将计算下面的等式,其中d是到最接近的整数的距离。
到目前为止我所写的内容:
def suma(x,y,z):
d = 0
f = 0
if x - math.ceil(x) < math.floor(x) - x:
d == x - math.ceil(x)
else:
d == math.floor(x) - x
for i in range(y,z):
k = list(range(y,z))
f += math.pow(2,k[i])*pow(d,2)*(x/pow(2,k[i]))
return f
print(suma(6,0,15))
结果是给了我0.0,我想知道我在哪里弄错了。
我真的很感谢你对下面的代码进行评估的支持 - 我不仅对Python很新,而且还是编程,但我很想学习并期待反馈。
提前多多感谢
答案 0 :(得分:2)
通过执行d == x - math.ceil(x)
,您实际上是在比较d的值。你打算写d = x - math.ceil(x)
。
这就是为什么它最后会返回0,因为d的值永远不会更新。
答案 1 :(得分:1)
除了使用==
进行分配外,您的代码还有一些问题:
d
不距离最近的整数的距离;当您输入x=6.3
时,您会获得-0.7
,但应获得0.3
。而只需使用d = x - round(x)
range
的循环没有任何意义,只有y
为0
才有效,因此k[i]
与i
相同;相反,只需循环for k in range(y, z)
有了这个,您可以简化/修复您的代码:
def suma(x, y, z):
d = x - round(x)
f = 0
for k in range(y, z):
f += 2**k * d**2 * x/(2.**k)
return f
或更短,使用带有生成器表达式的sum
。此外,无需在循环的每次迭代中计算d**2
:
def suma(x, y, z):
d2 = (x - round(x))**2
return sum(2**k * d2 * x/(2.**k) for k in range(y, z))
此外,正如评论中所述,2**k * d**2 * x/(2.**k)
应与d**2 * x
相同,因为两个2**k
相互抵消,因此您可以进一步简化代码;你甚至不需要总和,因为这些术语独立于k
(假设你的公式在发布时是正确的)。
def suma(x, y, z):
d2 = (x - round(x))**2
return d2 * x * (z - y)