如何在不使用内置函数求幂的情况下计算序列和?

How to calculate the sum of the sequence without using built-in functions for exponentiation?

我需要计算Python中序列的和 但我不能使用内置函数求幂。

这意味着我无法使用**pow()。我必须为此创建自己的函数。

所以我创建了求幂函数,但它只适用于数字。我需要计算我的公式到第 n 次。

我的求幂函数:

def exponentiation(a,b):
    result = 1
    for index in range(b):
        result = result * a
    return result

对于数字,它有效。但是当我想这样做到第 n 次时(我将 'n' 定义为符号)我得到:

'Symbol' object cannot be interpreted as an integer

所以我不知道如何解决这个问题。

如果我想计算序列的总和,我使用并且它有效:

sy.summation((-1/2)**n, (n,1, oo))

但正如我之前所说,我需要将 ** 更改为我自己的求幂函数,但它仍然显示 'Symbol' 对象不能被解释为整数。

sy.summation(exponentiation((-1/2),n), (n,1, oo))

你有什么建议吗?

'nth' 表示任何给定的数字。所以你不需要(我想不出你会怎么做)对任何符号取幂。我想你可以稍微简化一下,如果你 return 一个列表而不只是第 n 个值:

def exponentiation(a, n):
    result = 1
    exponents_list = []
    for i in range(n):
        result *= a
        exponents_list.append(result)
    return exponents_list

然后使用 for 循环处理列表以获得总和

如果您必须使用 sympy,请查看此答案:

我想说,用 Python-code 替换 ** 唯一有意义的解决方案是这样的:

def exponentiation(a,b):
    if isinstance(a, Symbol):
        return a.__pow__(b)
    if isinstance(b, Symbol):
        return b.__pow__(a)
    result = 1
    for index in range(b):
        result = result * a
    return result

如果你想 re-implement SymPys pow 函数 - 这对于 Whosebug-answer 来说肯定太难了;).

但是你可以在这里找到 SymPys 源代码: https://github.com/sympy/sympy/blob/master/sympy/core/power.py

您无法将 'n' 提升为幂。我很确定如果你被禁止使用 **pow() 使用 SymPy 也不会飞。

计算一下 results in you can simply assume a "big" n and check if you can still detect any difference between the earlier result and the next result - you will not see any more changes very fast due to floating math limitations (Is floating point math broken?):

def exponentiation(a,b):
    result = 1
    for index in range(b):
        result = result * a
    return result
s = 0
a = -1/2
for n in range(1, 10000000):
    old_s = s
    s += exponentiation(a,n)

    # do not compare floats with small differences with ==
    # see link below for better ways to do that
    if s == old_s:
        print("\nThe sum no longer changes due to floating math limitations.")
        print(f"Result before: {old_s} and after {s} for n={n}")
        break
    else:
        print(f"nResult before: {old_s} and after {s} for n={n}")

输出:

Result before: 0 and after -0.5 for n=1
Result before: -0.5 and after -0.25 for n=2
Result before: -0.25 and after -0.375 for n=3
[...snipp...]
Result before: -0.33333333333333326 and after -0.33333333333333337 for n=53
Result before: -0.33333333333333337 and after -0.3333333333333333 for n=54
Result before: -0.3333333333333333 and after -0.33333333333333337 for n=55

The sum no longer changes due to floating math limitations.
Result before: -0.33333333333333337 and after -0.33333333333333337 for n=56

有关浮点数比较的更多信息,请参阅 What is the best way to compare floats for almost-equality in Python?