4
Q
它是一个尾递归
A
回答
8
这不是尾递归。为了运行最后一个表达式(++
,列表级联),必须保留[h]
,并且新调用flatten(t)
将产生一个新的堆栈帧,并且不能替换前一个,因为引用了[h]
。
换句话说,通过tail-call-optimization,顶层的函数调用将取代先前的堆栈。该函数调用中的任何表达式都会事先发生,并会在调用时增加堆栈。
尾调优化(包括尾递归)的大多数枚举都使用累加器。要充分利用@ GavinBrelstaff的代码,这是尾递归形式:
defmodule RC do
def flatten(list, acc \\ [])
def flatten([], acc), do: Enum.reverse(acc)
def flatten([h|t], acc) when is_list(h), do: flatten(h++t, acc)
def flatten([h|t], acc), do: flatten(t, [h|acc])
end
的bodyless功能的语句这里只是建立[]作为默认累加器。因为我们总是预先考虑的,为了维护秩序,我们必须在完成后逆转列表。这是非常常见的事情,并且Enum.reverse在虚拟机中进行了高度优化。
相关问题
- 1. 递归与VS.尾递归
- 2. 这个Scheme是否函数尾递归?
- 3. 是这个函数尾递归吗?
- 4. r停止递归,但它不是一个无限递归
- 5. 尾递归?
- 6. Javascript尾递归
- 7. 的System.OutOfMemoryException一个尾递归函数
- 8. Coverting递归函数的尾递归一个在Python
- 9. 尾递归算法归并
- 10. 方案尾递归
- 11. 尾递归函数
- 12. 尾递归与List.fold_left
- 13. 计划。尾递归?
- 14. 尾v头递归
- 15. 尾递归组合
- 16. 尾递归连续
- 17. 尾递归和CPS
- 18. 尾递归vs头经典递归
- 19. 递归过程到尾递归过程
- 20. 尾递归与前向递归
- 21. 尾递归vs原始递归
- 22. 递归,尾递归和迭代
- 23. 尾递归仅仅是CPS的一个特例吗?
- 24. 斯卡拉尾递归为未尾递归
- 25. 如何区分尾递归调用/非尾递归调用?
- 26. 如何在非尾递归中转换尾递归
- 27. Java尾递归:低于斐波那契码尾递归?
- 28. 是否足够用于尾递归?
- 29. 尾递归函数总是要避免?
- 30. 为什么不是这种尾递归?
你的意思是“fp世界”? – CoderDennis
对不起,我的意思是fp。 –