遞歸乘法。 寫一個遞歸函數,不使用 * 運算符, 實現兩個正整數的相乘。可以使用加號、減號、位移,但要吝嗇一些。
例題:
輸入:A = 1, B = 10
輸出:10
思路:
1.遞歸加法
兩個數相乘,a*b等價於將b加個a次
def dg(self,a,b):
if a==1:
return b
return self.dg(a-1,b)+b
但是這樣計算的,當輸入1001,1時,會出現一下錯誤提示:
RecursionError: maximum recursion depth exceeded in comparison
這是因爲超過了最大遞歸次數1000次,所以遞歸之前,我們要將遞歸次數最小,把1001,加上1次
雖然還是會有限制但是可以通過的
if A>B:
A,B=B,A
return self.dg(A,B)
2.位運算
我們都知道一個正整數2,相當於將其右移一位,例:00100011=0110
所以
- a==0時,return 0
- a==1時,return b
- a>=2時,reutrn b<<1+self.dg(a-2,b)
值得注意的是,雖然位運算先對於加法能夠減少一半的遞歸,但仍然不能超1000次,所以交換大小還是有必要的
if A>B:
A,B=B,A
return self.dg(A,B)
def dg(self,a,b):
if a==0:
return 0
if a==1:
return b
return self.dg(a-2,b)+b<<1