Skip to content

Commit 25bba6c

Browse files
authored
Use tail recursion in tuple aggregates (#15708)
1 parent 8c49052 commit 25bba6c

1 file changed

Lines changed: 10 additions & 6 deletions

File tree

lib/elixir/lib/tuple.ex

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,12 @@ defmodule Tuple do
132132
"""
133133
@doc since: "1.12.0"
134134
@spec sum(tuple) :: number()
135-
def sum(tuple), do: sum(tuple, tuple_size(tuple))
135+
def sum(tuple), do: sum(tuple, 1, tuple_size(tuple) + 1, 0)
136136

137-
defp sum(_tuple, 0), do: 0
138-
defp sum(tuple, index), do: :erlang.element(index, tuple) + sum(tuple, index - 1)
137+
defp sum(_tuple, top, top, acc), do: acc
138+
139+
defp sum(tuple, index, top, acc),
140+
do: sum(tuple, index + 1, top, acc + :erlang.element(index, tuple))
139141

140142
@doc """
141143
Computes a product of tuple elements.
@@ -151,10 +153,12 @@ defmodule Tuple do
151153
"""
152154
@doc since: "1.12.0"
153155
@spec product(tuple) :: number()
154-
def product(tuple), do: product(tuple, tuple_size(tuple))
156+
def product(tuple), do: product(tuple, 1, tuple_size(tuple) + 1, 1)
157+
158+
defp product(_tuple, top, top, acc), do: acc
155159

156-
defp product(_tuple, 0), do: 1
157-
defp product(tuple, index), do: :erlang.element(index, tuple) * product(tuple, index - 1)
160+
defp product(tuple, index, top, acc),
161+
do: product(tuple, index + 1, top, acc * :erlang.element(index, tuple))
158162

159163
@doc """
160164
Converts a tuple to a list.

0 commit comments

Comments
 (0)