Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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 排序和运行时错误:比较中超过最大递归深度_Python_Python 3.x_Recursion_Functional Programming_Runtime Error - Fatal编程技术网

Python 排序和运行时错误:比较中超过最大递归深度

Python 排序和运行时错误:比较中超过最大递归深度,python,python-3.x,recursion,functional-programming,runtime-error,Python,Python 3.x,Recursion,Functional Programming,Runtime Error,我从未学过函数式编程,但我被迫在这个范例中实现自己的排序算法 这是我天真的做法: def sort(array): def step(idx, array): if idx == len(array)-1: return array if array[idx] > array[idx+1]: return step(0, array[0:idx] + [array[idx+1]] + [array[id

我从未学过函数式编程,但我被迫在这个范例中实现自己的排序算法

这是我天真的做法:

def sort(array):
    def step(idx, array):
        if idx == len(array)-1:
            return array
        if array[idx] > array[idx+1]:
            return step(0, array[0:idx] + [array[idx+1]] + [array[idx]]
                        + array[idx+2:len(array)])
        else: return step(idx+1, array)

    return step(0, array)
对于大小小于21的阵列,一切正常。但是当
len(array)
是21(当然是更大)时,我经常得到,但并不总是,
最大递归深度在比较中超过了

我曾尝试过基于Internet的功能性快速排序实现,即使对于百万元素数组,它也非常有效。很明显我做错了什么,但因为我没有函数式编程的经验,我不知道问题出在哪里。有什么帮助吗

快速排序:

def qsort(L):
    return (qsort([y for y in L[1:] if y <  L[0]]) + 
            L[:1] + 
            qsort([y for y in L[1:] if y >= L[0]])) if len(L) > 1 else L
def qsort(L):
返回(qsort([y代表L[1]中的y,如果y=L[0]])如果len(L)>1,则

您并不真的想用Python编写递归排序算法—它本身不支持尾部递归优化,因此堆栈会爆炸—更不用说它的效率非常低。。。你发现的其他Python实现也有吗?我并不真正关心效率,因为这是一个想法。我知道Python并不是解决这些问题的最佳选择。问题在于,功能强大的python快速排序实现非常有效,而对于大于20的数组,我的排序算法崩溃。为什么?我做错了什么?你用什么算法来比较?比较这两种方法是否能给出关键区别的提示?我已将此算法添加到我的问题中。您的算法一旦发现反转,就会递归。您展示的快速排序将数组拆分为两个子数组,然后在两个子数组中递归:递归深度是有限的。您真的不想用Python编写递归排序算法-它本身不支持尾部递归优化,因此堆栈会爆炸-更不用说它非常低效。。。你发现的其他Python实现也有吗?我并不真正关心效率,因为这是一个想法。我知道Python并不是解决这些问题的最佳选择。问题在于,功能强大的python快速排序实现非常有效,而对于大于20的数组,我的排序算法崩溃。为什么?我做错了什么?你用什么算法来比较?比较这两种方法是否能给出关键区别的提示?我已将此算法添加到我的问题中。您的算法一旦发现反转,就会递归。显示的快速排序将数组拆分为两个子数组,然后在两个子数组中递归:递归深度是有限的。