2
我想问一下,如果函数foldl
是尾递归?折叠左尾递归?
当我看看源,如何foldl
实现:
foldl :: (b -> a -> b) -> b -> [a] -> b
foldl f acc [] = acc
foldl f acc (x:xs) = foldl f (f acc x) xs
它看起来像一个尾递归。
向左折叠始终与左侧关联。假设我有以下表现:
foldl (*) 1 [1..3]
然后将计算为:
((1 * 1) * 2) * 3
然后写出来的步骤,我会做这样的:
foldl (*) 1 [1..3] =
foldl (*) (1 * 1) [2,3]
foldl (*) (1 * 2) [3]
foldl (*) (2 * 3) []
6
不喜欢((1 * 1) * 2) * 3
,还是我我错了?
Haskell没有尾递归的概念。它使用懒惰评估或thunk。 –
啊哈,这是什么意思?什么是thunk? –
此链接有关Haskell如何优化递归的信息。 https://stackoverflow.com/questions/13042353/does-haskell-have-tail-recursive-optimization –