如何处理python中的递归错误?

2024-06-16 12:29:01 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我创建了6个随机数列表,每个列表的长度不同:

arr = [random.randint(1,15000) for _ in range(1000)]

numbersList = [10,100,500,1000,5000,8000]
numbersForBenchmark = []
for i in range(len(numbersList)):
    arr = [random.randint(1,15000) for _ in range(numbersList[i])]
    numbersForBenchmark.append(arr)

print(numbersForBenchmark)
recursionTimeArray = []

现在我有一个递归快速排序:

def partition(lst, start, end):
    pos = start                           

    for i in range(start, end):           
        if lst[i] < lst[end]:            
            lst[i],lst[pos] = lst[pos],lst[i]
            pos += 1

    lst[pos],lst[end] = lst[end],lst[pos] 
    return pos

def quick_sort_recursive(lst, start, end):
    if start < end:                     
        pos = partition(lst, start, end)
        quick_sort_recursive(lst, start, pos - 1)
        quick_sort_recursive(lst, pos + 1, end)

然后是在所有阵列上工作的驱动程序:

for i in range(len(numbersForBenchmark)):
   arrRe = numbersForBenchmark[i]
   try:
        n = len(arrRe)
        start = time.time()
        quick_sort_recursive(arrRe,0,n-1)
        end = time.time()
        rekTime = end - start
        recursionTimeArray.append(rekTime)
   except RecursionError as re:
        print('Problem with recursive depth!)

如您所见,我测量time并将时间放入数组中。但我需要6个结果(我有6个数组),但在两个示例中,我两次出错:

    print('Problem with recursive depth!)

我试着用以下方法来处理它:

import sys
sys.setrecursionlimit(1500)

但程序在中午的某个时候结束了,我没有得到任何结果

我怎样才能解决这个问题


Tags: inposforlentimerangequicksort
1条回答
网友
1楼 · 发布于 2024-06-16 12:29:01

一些意见:

  • 您的简化问题遗漏了问题早期版本中的一个重要方面:您的原始代码还包括对迭代排序函数的调用
  • 该测试是有偏差的,因为您首先使用迭代方法对列表进行排序,然后在quicksort实现中使用相同的列表,该列表现在是排序的
  • 当输入列表已经排序时,您的快速排序实现将进入最糟糕的情况。pos变量将变为等于end,因此下一个分区将只删除一个值,这意味着递归深度将等于列表中的元素数。对于较大的列表,您将因此遇到递归限制

因此,依靠输入列表的随机性,仅仅解决第一个问题就足够了。更换这些线路:

arrIt = numbersForBenchmark[i]
arrRe = numbersForBenchmark[i]

与:

arrIt = numbersForBenchmark[i][:]
arrRe = numbersForBenchmark[i][:]

。。。应该没有更多的问题了

相关问题 更多 >