python 最大递归深度问题

python 递归深度

最近在学习算法相关内容, 当学习到快速排序时想到一个问题, 在最差情况下, 快速排序是否优于选择排序, 于是生成一个 3000 个元素的降序列表,分别使用选择排序和快速排序对其升序排序代码如下:

# –*– coding: utf-8 –*–
# @Time      : 2019/1/8 20:27
# @Author    : Damon_duanlei
# @FileName  : selectionsort_with_quicksort.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei
import copy
import time


def selection_sort(sort_list):
    new_list = []
    while len(sort_list):
        index = 0
        min_num = sort_list[0]
        for i in range(1, len(sort_list)):
            if min_num > sort_list[i]:
                min_num = sort_list[i]
                index = i
        new_list.append(sort_list.pop(index))
    return new_list


def quick_sort(sort_list):
    if len(sort_list) < 2:
        return sort_list
    else:
        mark = sort_list[0]
        less = []
        great = []
        for i in sort_list[1:]:
            if i <= mark:
                less.append(i)
            else:
                great.append(i)
        return quick_sort(less) + [mark] + quick_sort(great)


if __name__ == '__main__':
    list_a = [10000 - i for i in range(3000)]
    list_b = copy.deepcopy(list_a)
    t1 = time.time()
    new_list1 = selection_sort(list_a)
    t2 = time.time()
    new_list2 = quick_sort(list_b)
    t3 = time.time()
    print("选择排序用时:{}".format(t2 - t1))
    print("快速排序用时:{}".format(t3 - t2))


运行结果:

RecursionError: maximum recursion depth exceeded in comparison

异常原因:

程序运行超过了python允许的最大递归深度. python 解释器为了避免内存溢出和性能影响设置了最大递归深度为998, 当调用栈超过998层就会报错. 关于递归压栈问题可阅读 https://blog.csdn.net/Damon_duanlei/article/details/85939660 第三章内容

解决方法:

手动修改最大递归深度,代码如下:

import sys

sys.setrecursionlimit(3000) # 设置最大递归深度为3000

修改最大递归深度后在运行原有代码:

>>>
选择排序用时:0.27227139472961426
快速排序用时:0.37400031089782715

注意: 递归最大深度与使用版本,电脑性能和系统有关, 本篇使用环境 win10 + python 3.6 递归最大深度3000左右, 有传言 Windows 系统允许最大递归深度为3000, 如何修改如哪位朋友知晓请留言告知.

你可能感兴趣的:(算法,python,递归)