为了账号安全,请及时绑定邮箱和手机立即绑定

从同一函数内调用函数是否安全

从同一函数内调用函数是否安全

开满天机 2023-06-27 14:23:42
我一直在阅读排序算法。我遇到了合并排序的这段代码: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 函数 mergeSort() 是从自身内部调用的,这是一个好的做法吗?我的印象是它可能会导致错误。
查看完整描述

2 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

TL;DR 通常没问题,但对于某些输入可能非常危险。

给定的mergeSort函数调用自身 - 这种现象称为递归。

什么是递归

  1. 解决问题的常见方法,其中解决方案取决于同一问题的较小实例的解决方案;比如遍历二叉树。

  2. 每次递归调用都会将函数参数压入调用堆栈,并且每次调用都有自己的局部变量。

  3. 递归可能会导致漏洞,例如DNS 开放递归。

  4. 如果通过不定义停止条件或处理导致大量递归调用的输入而误用,则会发生堆栈溢出(这意味着调用堆栈已被使用到最大)。

  5. 任何递归解决方案都可以转换为迭代解决方案(使用循环的解决方案)

总结

  1. 当函数调用时间合理时,递归是安全的。

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

您可以使用以下方法验证它getrecursionlimit

import sys
print(sys.getrecursionlimit())

并将其更改为setrecursionlimit

new_recursion_limit = 1500
sys.setrecursionlimit(new_recursion_limit)
  1. 递归可能并且将会导致漏洞,并且最好在处理用户输入时避免 - 有利于迭代解决方案。

聚苯乙烯

现在您也知道我们的网站是以什么命名的了吧!


查看完整回答
反对 回复 2023-06-27
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

在函数内部调用函数没有问题,但您必须格外小心进入无限循环。这样做的一般良好做法是仅在函数末尾调用函数(这样可以减少混淆变量值的机会)并使用某种if语句或某种意义上的语句来提供出路。



查看完整回答
反对 回复 2023-06-27
  • 2 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信