当前位置: 首页 > 知识库问答 >
问题:

Python中的合并排序-运行时错误:超过了最大递归深度

乐正穆冉
2023-03-14

我正在使用Python进行合并排序。

我已经勾选了< code >合并功能。阵列融合得很好。

但在mergeSort函数中,将出现错误:---

RuntimeError:超过最大递归深度。

运行时错误回溯(最近一次调用)在 () 63 打印(arr[i]), 64 ---

在合并排序(arr,l,r)53 m=l(r-1)/2 54合并排序(ar,l,m)---

可能的原因是什么?

def merge(arr,l,m,r):
    n1 = m-l+1
    n2 = r-m

    L = [0] * n1
    R = [0] * n2

    print("First List")
    for i in range(0,n1):
        L[i] = arr[i+l]
        print(L[i]), 


    print("")
    print("Second List")    
    for j in range(0,n2):
        R[j] = arr[j+m+1]
        print(R[j]),



    #Merging the temp arrays
    i = 0
    j = 0
    k = 0
    print("")
    print("Merged List ---------->")

    while i < n1 and j < n2:
        if L[i] <= R[j]:
            arr[k] = L[i]
            print(arr[k]),
            i+=1
        else:
            arr[k] = R[j]
            print(arr[k]),
            j+=1
        k+=1

    while i<n1:
        arr[k] = L[i]
        i+=1
        k+=1

    while j<n2:
        arr[k] = R[j]
        print(arr[k])
        j+=1
        k+=1

def mergeSort(arr,l,r):
    if l<r:
        m = l+(r-1)/2
        mergeSort(arr,l,m)
        mergeSort(arr,m+1,r)
        merge(arr,l,m,r)


arr = [0,12,13,0,1,22]
n = len(arr)

mergeSort(arr,0,n-1)
print(" ")
print("Sorted Array is")
for i in range(0,n-1):
    print(arr[i])

共有3个答案

景仲渊
2023-03-14

这是因为当您调用合并排序函数时,您传递的是 l = 0 和 r= 列表长度。无论你在每种情况下的计算结果如何,你 l 都将小于 r。

 m = l+(r-1)/2
薛利
2023-03-14
    < li >你犯了最基本的错误。Python是动态类型语言 < li >在解释为什么会出现运行时递归错误之前,您需要做一个更改。< br >不要写< code>m = l (r-1)/2,而要写< code>m = (l r)/2
    因为当您调用< code>mergeSort(arr,0,n-1)时,< code>n-1是最后一个索引值,这就是为什么在< code>m = l (r-1)/2中不需要< code>r-1的原因

现在来的主要问题,为什么你得到的是,这就是答案。

  • 当你在做操作像

m=(l r)/2

除法运算将给出小数部分,即 m 将被视为浮动变量,
因此 m 永远不会为 0,它将是任何浮点数,例如 0.123 或 2.122 或 1.0025

由于浮点数为 m 永远不会为 0,if 条件如果 l

您希望m为整数,而不是浮点,因此不要使用m=(l r)/2

写 m=(l r)//2 地板除法运算符 (//) 会给你整数值,你的 mergeSort() 函数不会进入无限循环

这次您的代码将在没有任何错误的情况下执行,只需进行一次更改m=(l r)//2

但是但是但是你的合并()函数算法不好,它没有给出排序数组,数据丢失,其他东西被打印出来

夏侯承恩
2023-03-14

mergeSort 中计算 m 的方式是错误的(你需要将整个表达式的一半除以,而不仅仅是 (r-1))。将其更改为:

m = (l+(r-1))/2

当您计算错误时,您的方法一次又一次地递归调用自己,直到超过最大方法堆栈深度,从而崩溃。

 类似资料:
  • 问题内容: 我使用以下代码解决了Euler项目的问题10,该代码通过强力工作: 这三个功能的工作方式如下: isPrime 检查数字是否为质数; primeList 返回一个列表,其中包含一组在一定范围内且限制为“ n”的素数,并且; sumPrimes 对列表中所有数字的值求和。(不需要最后一个功能,但是我喜欢它的清晰度,特别是对于像我这样的初学者。) 然后,我编写了一个新函数 primeLis

  • 周一开始用Python编程。我喜欢学习它。但是当在tkinter菜单之间切换时,我一直试图理解如何避免递归。我确信这是一个非常基本的问题,我很感激你能容忍我在这个问题上的无知,但是我在别处找不到答案。 我现在所做的是,最终给了我一个错误:RuntimeError:调用Python对象时超出了最大递归深度 这是我目前使用的模式。更新:下面的代码现在是一个完整的、独立的副本,重现了我面临的问题!:D

  • 这是我的代码。打印map_appliance_info(df_appliance)时,我收到错误- 文件"E:/iisc/code/try.py",第69行,map_appliance_infodf_appliance_mapped=map_appliance_info(df_appliance) 文件“E:/iisc/code/try.py”,第35行,map_appliance_info中的i

  • 我对Python很陌生。我写了一个关于返回 x 在排序的重复元素数组 A 中的出现次数的函数: 错误是:运行时错误:超出最大递归深度。有人知道如何解决它吗?

  • 我不明白为什么我会得到这个最大深度错误。iam试图使用bst递归方法在数组中查找数字索引,下面是我的代码 任何人都可以告诉我代码块中发生了什么 错误块: PS C:\Users\admin\Desktop\DSA

  • 问题内容: 我从星期一开始使用Python进行编程。我很喜欢学习它。但是我一直试图了解如何在tkinter菜单之间切换时避免递归!我确信这是一个非常基本的问题,感谢您宽容我对此主题的无知,但我无法在其他地方找到答案。 我现在正在做的最终是给我错误:RuntimeError:调用Python对象时超出了最大递归深度 这是我目前正在使用的模式。更新:下面的代码现在是完整的隔离副本,再现了我面临的问题!