加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:22:08 所属栏目:大数据 来源:网络整理
导读:我最近偶然发现了这本书 Higher-order Perl,它基本上提出了在Perl中以功能方式做事情的方法。作者解释说,Perl在 Lisp的7个核心功能中有6个,而C没有。 我有一个问题,看起来像一个递归解决方案的好候选人,我以这种方式编码。但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级的函数调用是一个理智的限制。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读