为什么Perl如此害怕“深度递归”?

前端之家收集整理的这篇文章主要介绍了为什么Perl如此害怕“深度递归”?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我最近偶然发现了这本书 Higher-order Perl,它基本上提出了在Perl中以功能方式做事情的方法。作者解释说,Perl在 Lisp的7个核心功能中有6个,而C没有。

我有一个问题,看起来像一个递归解决方案的好候选人,我以这种方式编码。但Perl抱怨“深度递归”。我搜了一下,发现一个Perl修士解释说“Perl不是Haskell”。默认情况下,当递归深度超过100级时,您会收到投诉。

有办法扩展这个限制或完全关掉它,但我的问题是:

>有没有理由Perl对递归是如此的紧张,而Haskell是不是呢?

解决方法

因为在Haskell,我们有懒惰&守卫递归和尾调用优化,Perl也没有。

这实际上意味着每个函数调用都会分配一个称为“栈”的设置的内存量,直到函数返回。当您编写递归代码时,由于这些嵌套函数调用,您将构建大量内存,最终可能会堆栈溢出。 TCO允许未使用的块被优化。

没有这个,依靠递归并不是一个好主意。例如,说你写了一个递归版本的地图,它会崩溃与任何体面的大小的列表。在Haskell中,守卫的递归意味着使用大型列表,递归解决方案比“循环”函数快得多。

TLDR:Haskell的实现旨在处理功能/递归风格,并且perl的实现不是并且在过去的好时光回来,100级的函数调用是一个理智的限制。

猜你在找的Perl相关文章