Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python编写Karatsuba乘法代码时遇到递归错误_Python_Algorithm_Recursion_Multiplication - Fatal编程技术网

Python编写Karatsuba乘法代码时遇到递归错误

Python编写Karatsuba乘法代码时遇到递归错误,python,algorithm,recursion,multiplication,Python,Algorithm,Recursion,Multiplication,我是算法新手,我正在尝试使用递归函数调用为Karatsuba乘法算法编写代码 我知道karatsuba乘法通过将偶数n个数字分成两部分来工作,就像这样,其中两个数字是10^n/2*a+b和10^n/2*c+d a b xcd 通过计算10^n*ac+10^n/2*[(a+b)(c+d)-ac-bd]+b*d,可以得到乘积 这是我的带有注释说明的代码 def multiplication_algorithm(num1, num2): length1 = len(str(n

我是算法新手,我正在尝试使用递归函数调用为Karatsuba乘法算法编写代码

我知道karatsuba乘法通过将偶数n个数字分成两部分来工作,就像这样,其中两个数字是10^n/2*a+b和10^n/2*c+d a b xcd


通过计算10^n*ac+10^n/2*[(a+b)(c+d)-ac-bd]+b*d,可以得到乘积

这是我的带有注释说明的代码

    def multiplication_algorithm(num1, num2):
        length1 = len(str(num1))
        length2 = len(str(num2))
        length = max(length1, length2)
        if length == 1:
            return num1 * num2 #simply returns product if single digit inputs are encountered
        num1_str = str(num1)
        num2_str = str(num2)
        num1_str = '0' * (length - length1) + num1_str #makes the length of both strings the same by adding zeros to the beginning
        num2_str = '0' * (length - length2) + num2_str
        if length % 2 != 0:
            num1_str = "0" + num1_str #makes the length of strings even so they can be symmetrically split
            num2_str = "0" + num2_str
        mid = length//2
        num1_first_half = int(num1_str[:mid]) #next 4 lines break the 2 numbers in 4 halves
        num1_second_half = int(num1_str[mid:])
        num2_first_half = int(num2_str[:mid])
        num2_second_half = int(num2_str[mid:])
        part1 = multiplication_algorithm(num1_first_half, num2_first_half)
        part3 = multiplication_algorithm(num1_second_half, num2_second_half)
        part2 = multiplication_algorithm(num1_first_half + num1_second_half, num2_first_half + num2_second_half) - part1 - part3
        return (10 ** length) * part1 + (10 ** mid) * part2 + part3

    import random
    s=set()
    for i in range(10): #generating 10 pairs of random numbers in given range to check algorithm
        number1 = random.randint(1,999)
        number2 = random.randint(1,99)
        if multiplication_algorithm(number1, number2) == number1 * number2:
            print("Success")
        else:
            print("Failure")
当我使用random.randint(1,99)计算number1和number2运行此代码时,此代码工作正常,但当我使用number1=random.randint(1,99)和number2=random.randint(1999)运行此代码时,代码失败并生成递归深度错误。我已将错误文本复制粘贴到此处:

    Traceback (most recent call last):
      File "C:/Users/anura/AppData/Local/Programs/Python/Python38-32/multalgo.py", line 29, in <module>
        if multiplication_algorithm(number1, number2) == number1 * number2:
      File "C:/Users/anura/AppData/Local/Programs/Python/Python38-32/multalgo.py", line 20, in multiplication_algorithm
        part3 = multiplication_algorithm(num1_second_half, num2_second_half)
      File "C:/Users/anura/AppData/Local/Programs/Python/Python38-32/multalgo.py", line 20, in multiplication_algorithm
        part3 = multiplication_algorithm(num1_second_half, num2_second_half)
      File "C:/Users/anura/AppData/Local/Programs/Python/Python38-32/multalgo.py", line 20, in multiplication_algorithm
        part3 = multiplication_algorithm(num1_second_half, num2_second_half)
      [Previous line repeated 1018 more times]
      File "C:/Users/anura/AppData/Local/Programs/Python/Python38-32/multalgo.py", line 19, in multiplication_algorithm
        part1 = multiplication_algorithm(num1_first_half, num2_first_half)
      File "C:/Users/anura/AppData/Local/Programs/Python/Python38-32/multalgo.py", line 4, in multiplication_algorithm
        length = max(length1, length2)
    RecursionError: maximum recursion depth exceeded in comparison
回溯(最近一次呼叫最后一次):
文件“C:/Users/anura/AppData/Local/Programs/Python/Python38-32/multalgo.py”,第29行,在
如果乘法算法(number1,number2)=number1*number2:
文件“C:/Users/anura/AppData/Local/Programs/Python/Python38-32/multalgo.py”,第20行,乘法算法
第3部分=乘法算法(num1\u第二部分,num2\u第二部分)
文件“C:/Users/anura/AppData/Local/Programs/Python/Python38-32/multalgo.py”,第20行,乘法算法
第3部分=乘法算法(num1\u第二部分,num2\u第二部分)
文件“C:/Users/anura/AppData/Local/Programs/Python/Python38-32/multalgo.py”,第20行,乘法算法
第3部分=乘法算法(num1\u第二部分,num2\u第二部分)
[上一行重复了1018次]
文件“C:/Users/anura/AppData/Local/Programs/Python/Python38-32/multalgo.py”,第19行,乘法算法
第1部分=乘法算法(num1\u前半部分,num2\u前半部分)
文件“C:/Users/anura/AppData/Local/Programs/Python/Python38-32/multalgo.py”,第4行,乘法算法
长度=最大值(长度1,长度2)
RecursionError:比较中超出了最大递归深度

递归的数量远远超过了应有的数量,我不明白代码中发生了什么。

至少有一个问题是4位数字。你把它们分成两个两位数。num1_first_half+num2_second可能会给出一个3位数的数字,然后在开头加上一个0,再回到四位数


Wikipedia页面建议在length=4时停止递归。

扩展字符串以获得偶数长度后,使用旧长度计算
mid

if length % 2 != 0:
    num1_str = "0" + num1_str
    num2_str = "0" + num2_str
    length += 1    # <-- this was missing

mid = length//2
如果长度为%2!=0:
num1_str=“0”+num1_str
num2_str=“0”+num2_str
长度+=1#