每天来公司来得早,天冷打不了球,就写写小算法吧
C语言头文件math.h 里面有一个pow(x, y)函数,就是x ^ y,用算法实现:
def power(x: int, y: int):
if y == 0:
return 1
elif y == 1:
return x
ret = x
while (y > 1):
ret *= x
y -= 1
return ret
挺简单的。加入限制条件,O(logn)时间复杂度,O(1)空间复杂度,使用递归与非递归方式实现。
一般logn的时候,就一定会想 >> 1 这种,比如普通直给方式采用的是 O(n)的方式实现,那么比如 2¹² 就是 3次循环搞定。
def power_recursion(x: int, y: int) -> int:
if y == 0:
return 1
ret = power_recursive(x, int(y / 2)) * power_recursive(x, int(y / 2))
if y & 1:
return x * ret
else:
return ret
def power_tail_recursion(x: int, y: int, ret: int) -> int:
if y == 0:
return ret
if y & 1: # odd
ret *= x
y >>= 1
x *= x
return power_tail_recursive(x, y, ret)
def power_no_recursion(x: int, y: int) -> int:
ret = 1
while y > 0:
if y & 1: # odd
ret *= x
y >>= 1
x *= x
return ret