@@ -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