【问题标题】:Maximum recursion depth exceeded in my comparison在我的比较中超出了最大递归深度
【发布时间】:2017-08-06 23:04:49
【问题描述】:

我目前正在阅读算法简介 (CLRS)。在尝试解决练习 2.3-4 时,即通过递归排序 A[:n-1] 来编写 A 的插入排序。我已经编写了一个代码,我将在下面显示我生成随机数列表并尝试对其进行排序的代码,它适用于列表中最多一定数量的项目,但是当我将它增加到一千个时,我得到一个错误说最大递归深度超过了比较,从在线检查我注意到有一种方法可以将递归深度增加到某个值,但我不确定这是否是好的做法,或者我应该以某种方式改进我的代码。任何帮助,将不胜感激。谢谢你

import random
numlist = []
for i in range(1000):
    numlist.append(i)
random.shuffle(numlist)

def rec_ins_sort(L):
    if(len(L) == 1):
        return L
    else:
        step = rec_ins_sort(L[:len(L)-1])
        return insert(L[len(L)-1], step)

def insert(a, inp_list):
    inp_list.append(a)
    i = len(inp_list) - 2
    while(i > 0 and inp_list[i] > a):
        inp_list[i+1] = inp_list[i]
        i -= 1
    inp_list[i+1] = a
    return inp_list

【问题讨论】:

  • 列表大小的递归通常不是一个好主意。由于调用堆栈随项目数量而变化。
  • 递归到与输入大小成比例的深度的算法不适合 Python。这是你在像 Scheme 这样的函数式语言中会做的事情,它旨在允许更深的调用堆栈。
  • 归并排序不是一种使用分而治之的递归排序方法吗?这似乎有效。应该在哪里避免
  • @ariamis07: 那是因为它使用 O(log n) 递归,其中 n 是输入的 size .
  • 没有。合并排序是一种分而治之 - 对数复杂性递归深度。

标签: python algorithm recursion insertion-sort


【解决方案1】:

但我不确定这是否是一种好的做法,或者我应该以某种方式改进我的代码。

在输入的大小中递归线性(或超线性)的算法通常不是一个好主意,除非编程语言支持尾调用优化(TCO)(Python 不支持),程序是尾递归。在这种情况下,调用堆栈根本不会增长,因为最后一个调用帧被覆盖了。

例如,

MergeSort 是一种在 O(log n) 中递归的算法,n 是输入的大小。因此,调用堆栈不会增长太多:如果列表有 1'073'741'824 个元素,调用堆栈将增长约 30 级深度。

用于插入排序。我真的没有看到一种优雅的方式让它在 O(log n) 中递归,所以你最好不要使用递归:你可以在这里简单地使用迭代:

def rec_ins_sort(L):
    iflen(L) < 1:
        return L
    else:
        R = []
        for l in L:
            R = insert(l,R)
        return R

def insert(a, inp_list):
    inp_list.append(a)
    i = len(inp_list) - 2
    while(i > 0 and inp_list[i] > a):
        inp_list[i+1] = inp_list[i]
        i -= 1
    inp_list[i+1] = a
    return inp_list

也就是说,构建新列表等不是很有效,要么使该算法比严格必要的要慢。

所以总结一下:你最好不要在 Python 中构建在输入大小上递归(超)线性的算法。在这种情况下,您最好将其转换为迭代方法。

【讨论】:

  • 我现在明白了。我尝试递归插入排序的唯一原因是因为问题是找到递归插入排序的运行时间。但是,是的,我会记住的。非常感谢您的回答
猜你喜欢
  • 1970-01-01
  • 2019-04-18
  • 2021-02-13
  • 2020-08-03
  • 2017-11-05
  • 2013-11-30
  • 2019-03-23
  • 2016-09-19
  • 2018-05-09
相关资源
最近更新 更多