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)