我有一个问题,看起来像一个递归解决方案的好候选人,我以这种方式编码。但Perl抱怨“深度递归”。我搜了一下,发现一个Perl修士解释说“Perl不是Haskell”。默认情况下,当递归深度超过100级时,您会收到投诉。
有办法扩展这个限制或完全关掉它,但我的问题是:
>有没有理由Perl对递归是如此的紧张,而Haskell是不是呢?
这实际上意味着每个函数调用都会分配一个称为“栈”的设置的内存量,直到函数返回。当您编写递归代码时,由于这些嵌套函数调用,您将构建大量内存,最终可能会堆栈溢出。 TCO允许未使用的块被优化。
没有这个,依靠递归并不是一个好主意。例如,说你写了一个递归版本的地图,它会崩溃与任何体面的大小的列表。在Haskell中,守卫的递归意味着使用大型列表,递归解决方案比“循环”函数快得多。
TLDR:Haskell的实现旨在处理功能/递归风格,并且perl的实现不是并且在过去的好时光回来,100级的函数调用是一个理智的限制。