我该如何执行此操作:
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
但那没用。价值非常高。
由于
答案 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