计算python中的和

时间:2017-03-20 14:47:40

标签: python sum

在上课期间,我被要求编写一个程序,该程序将计算下面的等式,其中d是到最接近的整数的距离。

1

到目前为止我所写的内容:

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很新,而且还是编程,但我很想学习并期待反馈。

提前多多感谢

2 个答案:

答案 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的循环没有任何意义,只有y0才有效,因此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)