- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 python 中使用递归编写了一个 MergeSort 程序,但我不断收到有关第 27 行、第 23 行、第 18 行和递归错误的错误:
“RecursionError:比较时超出了最大递归深度”,但我似乎没有在我的代码中发现任何明显的错误。
def merge(list, start, middle, end):
L = list[start:middle]
R = list[middle:end+1]
L.append(99999999999)
R.append(99999999999)
i = j = 0
for k in range(start, end+1):
if L[i] <= R[j]:
list[k] = L[i]
i += 1
else:
list[k] = R[j]
j+=1
def mergesort2(list, start, end):
if start < end:
middle = (start + end)//2
mergesort2(list, start, end)
mergesort2(list, middle+1, end)
merge(list, start, middle, end)
def mergesort(list):
mergesort2(list, 0, len(list)-1)
mylist = [8,23,4,56,75,21,42,10,2,5]
mergesort(mylist)
print(mylist)
谢谢
最佳答案
def mergesort2(list, start, end):
if start < end:
middle = start + (end - start)//2
mergesort2(list, start, middle) // notice middle instead of end.
mergesort2(list, middle+1, end)
merge(list, start, middle, end)
您在不减小其大小的情况下递归使用相同的列表,因此它永远不会达到基本情况。
编辑:另外,middle应该通过start + (end-start)/2
来计算,而不是(start+end)/2
,以避免在使用大数组时出现整数溢出错误.这是一个很好的做法。
编辑 2:进一步分析代码后,我发现输出是错误的。我已尝试更正它们,这是我的代码:
def merge(start, middle, end):
L = l[:middle]
R = l[middle:]
i = j = k = 0
while i < len(L) and j < len(R):
if L[i] <= R[j]:
l[k] = L[i]
i += 1
else:
l[k] = R[j]
j+=1
k += 1
while i < len(L):
l[k] = L[i]
i += 1
k += 1
while j < len(R):
l[k] = R[j]
j += 1
k += 1
def mergesort2(start, end):
if start < end:
middle = start + (end - start)//2
mergesort2(start, middle)
mergesort2(middle+1, end)
merge(start, middle, end)
def mergesort(l):
mergesort2(0, len(l)-1)
l = [8,23,4,56,75,21,42,10,2,5]
mergesort(l)
print(l)
需要注意的几点:
将变量名从 list
更改为 l
以避免与关键字 list
混淆。
将列表传递给每个函数是没有用的,因为它已经声明为全局变量。
merge()
有一些问题。循环实际上应该从 0
开始运行,直到两个列表的长度都没有交叉。如果交叉,则只复制其余元素。
使用正确的 Python 拼接技术 :-p
关于Python - MergeSort 递归错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41118705/
我刚刚实现了这两种算法,当我绘制结果时我很惊讶!递归实现显然比迭代实现更快。之后,我将插入排序与两者相结合,结果是一样的。 在讲座中,我们经常看到递归比阶乘计算中的迭代慢,但在这里似乎并非如此。我很确
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 8年前关闭
尝试在 Java 中实现归并排序。我在脑海中仔细检查了我的代码,我觉得它应该可以工作,但显然我做错了什么。这是代码 public static void mergeSort(int[] inp
我有一个程序 Mergesort 与无序列表一起工作。我得到的问题是段错误(核心转储)。 实际上,我经常收到此错误,但我不知道如何解决。此外,它不会显示任何错误或警告消息来查找它。在这个源代码和其他一
我正在尝试使用多线程实现合并排序的版本。首先,我知道这里有十亿条线索(给予或接受......),而我读了一些但无济于事!我试图证明并行使用线程可以加快进程的速度。然而,我遇到的问题是我的代码没有显示和
package merge; public class Merger { int[] a = {1, 10, 5, 9}; // int[] a = {1, 10, 5, 9, 8, 6, 3,
我正在上算法课,并试图在 C++ 中实现合并排序。我试图存储左右子数组,但意识到我无法这样做,因为我无法在运行时初始化大小。有没有办法解决这个问题,或者我是否错误地进行了排序过程?我在下面列出了我所拥
遇到合并排序问题。对数组进行排序后,我希望它只打印完全排序的数组,而不是每次传递。我的代码如下。我在数组似乎已排序后运行 printArray(intArray) 。也许我把它放在错误的地方?您可以在
练习合并排序时遇到问题。我在线程“main”java.lang.ArrayIndexOutOfBoundsException 中收到异常:1mergeSort 部分工作得很好,但重新组装数组对我来说很
在多次递归调用后,low 变为等于 high,递归中断。之后会发生什么?谁能解释一下。合并过程对我来说很清楚:当调用 mergesort(0,5) 时,它会再次调用自身:mergesort(0,2)
这是基于 Cormen 书中给出的算法。我做错了什么? #include #include void mergesort(int a[],int,int); void merge(int a[],
我正在尝试在合并函数中使用 for 循环为 mergesort 编写 C 代码。不幸的是它不工作。在 main 函数中,我按降序在 10 个 int 上创建了一个 array,然后调用 mergeso
代码目录结构, ./Computing$ ls -LR .: list file.txt mergeSort.c program.exe type.h ./list: arrayImpl.c l
我想制作一个 MergeSort 算法,我想从外部文件(如 txt)获取我的数据,当我导入我的文件时,我得到一些奇怪的结果 [9. 9. 9. 9.] 我的输入数据是 [12, 44, 11, 9]
我一直在尝试实现我的“自己的”MergeSort,它似乎适用于较小的值,但我正在以随机顺序在 1-100,000 的数组上尝试它,并在打印时混合了一些奇怪的数字退出。我已经跟踪了 10 次,但都没有运
我一直在尝试编写一个基本的自上而下的归并排序,但代码执行完毕后数组并未完全排序。我试过调试它,但所有的递归使得很难查明。我也曾尝试将我的代码与其他合并排序示例进行比较,但我没有找到任何差异 p
我在 python 中使用递归编写了一个 MergeSort 程序,但我不断收到有关第 27 行、第 23 行、第 18 行和递归错误的错误: “RecursionError:比较时超出了最大递归深度
我正在使用“算法简介”中描述的算法实现 Mergesort。但是,在每次执行时,我都会得到一个垃圾值作为排序数组的第一个元素。这是它的代码: #include #include #include
以下合并排序来自数据结构和算法分析 (Weiss)。我想知道的是合并步骤中的最后一个 for 循环。我知道我们必须将 tmpArray 复制回 array,但我不明白为什么我们从 rightend 开
我的教授分配了一个问题,我们必须使用堆栈(或队列)来进行非递归 MergeSort。目前代码如下: private static void sort(Comparable[] a, int[] in
我是一名优秀的程序员,十分优秀!