Binary Exponentiation
Binary Exponentiation 快速幂算法,或者叫二进制取幂。
LeetCode 模板题:50. Pow(x, n)
递归版:
class Solution:
def myPow(self, x: float, n: int) -> float:
if n < 0: return 1 / self.myPow(x, -n)
if n == 0: return 1
if n == 1: return x
return self.myPow(x * x, n // 2) * (x if n % 2 == 1 else 1)迭代版:
class Solution:
def myPow(self, x: float, n: int) -> float:
if n < 0: return 1 / self.myPow(x, -n)
ans = 1
while n:
ans *= x if n % 2 == 1 else 1
n //= 2
x *= x
return ans实现非常简单。
最近经常用这样的语句:A = expr and B or C,表达在是否满足条件时把不同的值赋给 A。如果把上面的第六行替换成:ans *= n % 2 == 1 and x or 1 也会通过全部测试(2021/12/17 共 304 个测试用例),但是其实是错的,当输入是 0 和 1 时,结果应该是 0 但是输出是 1。这就是因为 n % 2 == 1 and x or 1 的结果,当 x == 0 是不管怎样都是 1。
顺手写成了利用短路的形式,没想到还发现了一个 missing text case。已提交 issue。
这个故事告诉我们少用 A = expr and B or C 这种句式……