def pow_x(x,m):
if m == 0:
y=1
else:
y = pow_x( x, m//2)
y = y**2 # y^2在python中是按位异或运算,y**2才是幂运算
if m%2 == 1:
y*=x
print("m:", m, "y=", y)
return y
print(pow_x( 2, 5))
# print:
# m: 1 y= 2
# m: 2 y= 4
# m: 5 y= 32
# 32
使用了分治法的思想,将幂的计算分解成多个子问题,从而减少了计算的次数。
具体来说,这个函数首先判断幂是否为 0,如果是,直接返回 1;
否则,将幂分解成两个子问题,分别计算 x 的 m//2 次幂,然后将它们的乘积平方得到 x 的 m 次幂。如果 m 是奇数,还需要再乘上一个 x,得到 x 的 m 次幂。
通过这样的分治计算,可以将幂的计算次数减少到 O(log m),从而大大提高了计算效率。