gpt4 book ai didi

functional-programming - 递归和尾调用优化示例

转载 作者:行者123 更新时间:2023-12-04 19:54:31 24 4
gpt4 key购买 nike

我正在尝试学习 Elixir 和函数编程,但在理解 Elixir in Action 一书中的这个例子时遇到了困难。

defmodule ListHelper do
def sum([]), do: 0
def sum([head | tail]) do
head + sum(tail)
end
end

ListHelper.sum([12,3,4])

它的返回值为 19,但我不明白这些值是如何累积的。

我以为 head 会不断更新,然后当模式与 [] 匹配时,累积的 head 将被添加到 0 并且该函数将退出,但是之后玩它我现在认为这不是正在发生的事情。有人可以为这个例子中发生的事情提供另一种解释吗?如果我需要解释更多,我可以尝试重新访问它。

最佳答案

sum([head | tail])head + sum(tail),所以 sum([12,3,4])12 + sum([3,4])sum([3,4])3 + sum([4])sum([4])4 + sum([])sum([])0,所以我们总共得到:

sum([12,3,4]) = 12 + sum([3,4])
= 12 + 3 + sum([4])
= 12 + 3 + 4 + sum([])
= 12 + 3 + 4 + 0
= 19

sum 的递归调用不是尾调用,因此此处不会发生尾调用优化。要使其成为 TCO,需要递归调用 sum 成为最后一个。

defmodule ListHelper do
def sum([], acc), do: acc
def sum([head | tail], acc),
do: sum(tail, acc + head)
end

ListHelper.sum([12,3,4], 0)
#⇒ 19

关于functional-programming - 递归和尾调用优化示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59556260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com