![]() |
1
36
这里有两个问题。一个是一般的尾部递归,另一个是Haskell如何处理事情。
第二个问题是 懒惰的评价 . 由于Haskell只根据需要对表达式求值,因此默认情况下,尾部递归并不完全按照通常的方式工作。它没有按原样替换每个调用,而是构建了一个巨大的嵌套“thunks”堆,即尚未请求其值的表达式。如果这个重击堆变得足够大,它确实会产生堆栈溢出。 Haskell实际上有两种解决方案,具体取决于您需要做什么:
另外,要记住GHC是非常聪明的,如果您使用优化进行编译,它经常会发现评估应该严格的地方,并为您处理它。不过,这在GHCi行不通。 |
![]() |
2
8
您应该使用内置机制,这样就不必考虑如何使函数尾部递归
或者如果尚未定义产品:
(见 http://www.haskell.org/haskellwiki/Foldr_Foldl_Foldl%27 关于哪个折叠。。。使用版本) |
![]() |
Luiz Miranda · 尾递归pow-Erlang 7 年前 |
![]() |
Srinivas · Scala中的尾部递归 7 年前 |
![]() |
madtyn · Python:有可能使这个尾部递归阶乘更快吗? 7 年前 |
![]() |
clay · Scala中的尾部递归findNextAndTail 7 年前 |
![]() |
Sanitiy · 如何在调用另一个函数后强制函数退出? 7 年前 |
![]() |
Lorinc Nyitrai · Lua-将协程递归重写为尾部调用递归 8 年前 |
![]() |
Alex · 尾部递归调用(C primer加上书本示例) 9 年前 |
![]() |
Thomas Ahle · 递归联合查找是否可以优化? 9 年前 |
![]() |
beta Rob · 这个函数真的是尾部递归的吗? 12 年前 |