From ad6b356b20754b7700d46bc4a40b5be24bc95d89 Mon Sep 17 00:00:00 2001 From: Daniel Kukula Date: Fri, 31 Jul 2026 22:28:43 +0200 Subject: [PATCH 1/2] use tail recursion --- lib/elixir/lib/tuple.ex | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/elixir/lib/tuple.ex b/lib/elixir/lib/tuple.ex index f2da15d6c40..df0e8d12a13 100644 --- a/lib/elixir/lib/tuple.ex +++ b/lib/elixir/lib/tuple.ex @@ -132,10 +132,10 @@ defmodule Tuple do """ @doc since: "1.12.0" @spec sum(tuple) :: number() - def sum(tuple), do: sum(tuple, tuple_size(tuple)) + def sum(tuple), do: sum(tuple, 1, tuple_size(tuple) + 1, 0) - defp sum(_tuple, 0), do: 0 - defp sum(tuple, index), do: :erlang.element(index, tuple) + sum(tuple, index - 1) + defp sum(_tuple, top, top, acc), do: acc + defp sum(tuple, index, top, acc), do: sum(tuple, index + 1, top, acc + :erlang.element(index, tuple)) @doc """ Computes a product of tuple elements. @@ -151,10 +151,12 @@ defmodule Tuple do """ @doc since: "1.12.0" @spec product(tuple) :: number() - def product(tuple), do: product(tuple, tuple_size(tuple)) + def product(tuple), do: product(tuple, 1, tuple_size(tuple) + 1, 1) - defp product(_tuple, 0), do: 1 - defp product(tuple, index), do: :erlang.element(index, tuple) * product(tuple, index - 1) + defp product(_tuple, top, top, acc), do: acc + + defp product(tuple, index, top, acc), + do: product(tuple, index + 1, top, acc * :erlang.element(index, tuple)) @doc """ Converts a tuple to a list. From 63237ed4367197038ce8d0b957a0754e54548ba1 Mon Sep 17 00:00:00 2001 From: Daniel Kukula Date: Sat, 1 Aug 2026 07:08:51 +0200 Subject: [PATCH 2/2] format --- lib/elixir/lib/tuple.ex | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/elixir/lib/tuple.ex b/lib/elixir/lib/tuple.ex index df0e8d12a13..273cc79153a 100644 --- a/lib/elixir/lib/tuple.ex +++ b/lib/elixir/lib/tuple.ex @@ -135,7 +135,9 @@ defmodule Tuple do def sum(tuple), do: sum(tuple, 1, tuple_size(tuple) + 1, 0) defp sum(_tuple, top, top, acc), do: acc - defp sum(tuple, index, top, acc), do: sum(tuple, index + 1, top, acc + :erlang.element(index, tuple)) + + defp sum(tuple, index, top, acc), + do: sum(tuple, index + 1, top, acc + :erlang.element(index, tuple)) @doc """ Computes a product of tuple elements.