面试题 08.05. 递归乘法
方法1:常规思路;写一个递归函数使用加法
class Solution:
def multiply(self, A: int, B: int) -> int:
def recursion(A,num):
if num==0:
return 0
return A+recursion(A,num-1)
return recursion(A,B)
优化加法:
始终使A为最大值;
class Solution:
def multiply(self, A: int, B: int) -> int:
#优化
if A<B: A,B=B,A
return 0 if B==0 else (A+self.multiply(A,B-1))
方2:迭代,位运算
A是双数的情况,结果为:(A//2)×(B×2)。(也就是:(A>>1)×(B<<1))
A是单数的情况,结果为:(A//2)×(B×2)+B。(也就是:(A>>1)×(B<<1)+B)
例:
21×5
=10×10+5
=5×20+5
=2×40+20+5
=1×80+20+5
=80+20+5
=105
class Solution:
def multiply(self, A: int, B: int) -> int:
#方2:迭代
# A是双数的情况,结果为:(A//2)×(B×2)。(也就是:(A>>1)×(B<<1))
# A是单数的情况,结果为:(A//2)×(B×2)+B。(也就是:(A>>1)×(B<<1)+B)
res = 0
while A:
if A%2:
print(B)
res += B
A>>=1
B<<=1
return res
方3:递归
例:
6×5
=3×5+3×5
=1×5+1×5+5+1×5+1×5+5+5
=5+5+5+5+5+5
=30
class Solution:
def multiply(self, A: int, B: int) -> int:
#方3,递归
if A == 0:
return 0
p = self.multiply(A >> 1, B)
if A%2:
return B+p+p
return p+p