Exponentiate(Multiply)没有**(Python)

时间:2018-02-03 22:06:10

标签: python math exponential

我该如何执行此操作:

if p1 == 0:
    return 1
if p1 == 1:
    return temp_obj
if p1 == 2:
    return temp_obj*temp_obj
if p1 == 3:
    return temp_obj*temp_obj*temp_obj
if p1 == 4:
    return temp_obj*temp_obj*temp_obj*temp_obj

不使用**

我实际上是在一个重载 pow 的类中写这个,而 * 已经超载了。

我试过

for x in range(p1):
  temp_obj = temp_obj * temp_obj

但那没用。价值非常高。

由于

3 个答案:

答案 0 :(得分:6)

这不起作用的原因是因为你平方每个电源值的数字。这意味着对于p1 = 3,我们得到:

temp_obj = 5
temp_obj = temp_obj * temp_obj = 25
temp_obj = temp_obj * temp_obj = 625
temp_obj = temp_obj * temp_obj = 390625

所以你实际上计算了 5 2 3 。所以 5 8 = 390'625

我们可以通过每次乘以​​值来解决这个问题,所以:

def power(x, p):
    if not p:
        return 1
    y = x
    for x in range(p-1):
        y *= x
    return y

但这可以在线性时间内工作,我们也可以用对数时间构建一个算法:

def power(x, p):
    if p == 0:
        return 1
    elif p & 1:
        return x * power(x*x, p//2)
    else:
        return power(x*x, p//2)

或者,如果我们想减少递归调用的开销,那就是命令式版本:

def power(x, p):
    r = 1
    while p:
        if p & 1:
            r *= x
        x *= x
        p >>= 1
    return r

例如:

>>> power(5, 6)
15625
>>> power(5, 1)
5
>>> power(5, 0)
1
>>> power(3, 2)
9
>>> power(3, 7)
2187

答案 1 :(得分:2)

假设乘法是关联的,你可以通过平方(O(log n))来使用取幂:

def pow(obj, num):
  res = 1  # assuming 1 is the identity
  while num:
    num, mul = divmod(num, 2)
    if mul:
      res *= obj
    obj *= obj
  return res

答案 2 :(得分:0)

您的尝试无效,因为修改temp_obj时,您不再将其乘以原始值。您还可以尝试以下方法:

initial_value = temp_obj
for x in range(p1):
  temp_obj = temp_obj * initial_value