Python 从同一函数中调用函数安全吗

Python 从同一函数中调用函数安全吗,python,python-3.x,function,recursion,Python,Python 3.x,Function,Recursion,我一直在读排序算法。我遇到了以下用于合并排序的代码: def mergeSort(arr): if len(arr) > 1: mid = len(arr)//2 L = arr[:mid] R = arr[mid:] #function calls itself here<<<<<<<<<<<<<<<<<<&l

我一直在读排序算法。我遇到了以下用于合并排序的代码:

def mergeSort(arr):
    if len(arr) > 1:
        mid = len(arr)//2
        L = arr[:mid]
        R = arr[mid:]
        #function calls itself here<<<<<<<<<<<<<<<<<<<<<<<<<
        mergeSort(L)# Sorting the first half
        mergeSort(R)# Sorting the second half

        i = j = k = 0
    
        # Copy data to temp arrays L[] and R[] 
        while i < len(L) and j < len(R):
            if L[i] < R[j]:
                arr[k] = L[i] 
                i+= 1
            else: 
                arr[k] = R[j] 
                j+= 1
                k+= 1
    
        # Checking if any element was left 
        while i < len(L): 
            arr[k] = L[i] 
            i+= 1
            k+= 1
    
        while j < len(R): 
            arr[k] = R[j] 
            j+= 1
            k+= 1

# Code to print the list 
def printList(arr):
    for i in range(len(arr)):
        print(arr[i], end =" ")
    print() 

# driver code to test the above code 
if __name__ == '__main__': 
    #arr = [12, 11, 13, 5, 6, 7]
    arr = [38, 27, 43, 3, 9, 82, 10]
    print ("Given array is", end ="\n") 
    printList(arr) 
    mergeSort(arr) 
    print("Sorted array is: ", end ="\n") 
    printList(arr) 

# This code is contributed by Mayank Khanna 
def合并排序(arr):
如果len(arr)>1:
mid=len(arr)//2
L=arr[:中间]
R=arr[mid:]

#函数在这里调用自身TL;DR:通常情况下是好的,但对于某些输入来说可能非常危险

给定的
mergeSort
函数调用自身,这种现象被调用

什么是递归

  • 一种解决问题的常用方法,其中解决方案取决于同一问题的较小实例的解决方案;例如遍历二叉树
  • 每个递归调用都将函数参数推入,并且每个调用都有自己的局部变量
  • 例如,递归可能导致漏洞
  • 如果由于未定义停止条件或处理导致大量递归调用的输入而被误用,则会发生错误(这意味着已最大限度地使用)
  • 总之

  • 当函数调用一段合理的时间时,递归是安全的

  • Python的默认递归限制是
    1000
    ,所以函数调用自身的次数不能超过
    1000次

  • 您可以使用
    getrecursionlimit
    验证它:

    import sys
    print(sys.getrecursionlimit())
    
    并将其更改为:

  • 递归可能也将导致漏洞,最好在处理用户输入时避免,以利于迭代解决方案
  • 附言


    现在你也知道我们网站的名字了

    调用函数本身是没有问题的,但在进入无限循环时必须格外小心。一般来说,这样做的好做法是只在函数的末尾调用函数(这样可以减少混淆变量值的机会),并使用某种
    if
    语句或类似的语句来提供解决方法。

    是的,递归是完全正常和可接受的。变量保存在堆栈上。递归的一个简单好例子是找到一个数字的阶乘。有时需要使用递归,这是一个很好的实践。
    set\u recursion\u limit
    是在Python中增加递归限制的简单方法
    new_recursion_limit = 1500
    sys.setrecursionlimit(new_recursion_limit)