您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么Python具有最大的递归深度?

为什么Python具有最大的递归深度?

实际上这里有一些问题。

首先,正如NPE的回答很好地说明的那样,Python不会消除尾部调用,因此许多允许进行无限递归的函数(例如Scheme)在Python中受到限制。

其次,正如NPE所解释的那样,无法消除的调用占用了调用堆栈上的空间。而且,即使在执行TCE的语言中,也有很多递归函数不能像迭代那样对待。(考虑一下朴素的Fibonacci函数,该函数递归调用两次。)

但是为什么调用栈首先是有限的资源呢?Python堆栈框架至少可以原则上在堆上实现并链接在一起(有关该原理的存在性证明,请参见Stackless),并且在64位内存空间中,可以容纳1000个以上的堆栈框架。(实际上,即使是几乎任何现代平台上的C堆栈,也都可以容纳1000多个递归Python解释器调用。)

部分原因是历史原因:当您进行递归调用时,现有的Python解释器使用固定的C堆栈来递归调用自身,它最初是为32位(甚至24位或20位)平台设计的,堆栈很小。

但这可能已经改变,Python 3.0将是更改它的理想场所。那么,为什么不呢?因为他们做出了自觉的语言设计决策。在Pythonic代码中,递归通常非常浅(例如,类似的代码os.walk会遍历浅树结构)。如果函数的深度达到1000左右,那么它很有可能是错误而不是有意的。因此,限制仍然存在。当然,这有点循环- 如果他们删除了限制(尤其是如果他们消除了尾部调用),则更深层次的递归将变得更加惯用。但这就是重点- 圭多(Guido)不需要一种习惯于深度递归的语言。(并且大多数Python社区都同意。)

python 2022/1/1 18:32:47 有209人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶