遞歸乘法之位運算

遞歸乘法。 寫一個遞歸函數,不使用 * 運算符, 實現兩個正整數的相乘。可以使用加號、減號、位移,但要吝嗇一些。
例題:
輸入: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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章