2

だから私はPythonでカラツバの乗算アルゴリズムを実装しています。現在、私は無限の再帰を持っており、それを理解することはできません。何か案は?必要に応じて、さらにコードを提供します。

  def multiply(self, other):


  # helper function
    def split(largeInt, n):
     least = largeInt._least_significant_digits(n/2)
     most = largeInt._right_shift(n/2)
     if debug: assert least.to_int() + (most.to_int() << (LargeInt.base_bits*(n/2))) == largeInt.to_int()
     return least, most
  n = max(len(str(self)),len(str(other)))
  if (n==1):
     return self.to_int() * other.to_int()
  else:
     aR, aL = split(self,n)
     bR , bL = split(other, n)
     x1 = aL.multiply(bL)
     x2 =aR.multiply(bR)
     a = aL.add(bL)
     b = aR.add(bR)
     x3=a.multiply(b)
  # code for recursive step here
  #return 1 # change this line with your implementation
  return  x1 * 10**n + (x3-x1-x2) * 10**(n/2) + x2
4

2 に答える 2

1

いくつかのヒント:

  • a、、の値は、あなたが望んbでいるものではないと思います。
  • よくあるエラーは、splitが厳密に小さい数を返さないことです。 _least_significant_digits、のソースを提供してください_right_shift
  • 入力の1つが長さ1で、もう1つが長さでない場合はどうなりますか?その場合、1桁の数字のスプリットリターンは何ですか?
于 2012-05-01T09:42:21.847 に答える
0

渡される数値の最大長を計算していましたが、この方法で修正しました。

   n = max(len(self.digits),len(other.digits))
于 2012-05-01T15:04:54.217 に答える