a-conjecture-of-mine

An exercise on polyglossy: the same problem solved on multiple languages

commit f4a708aee096ffa86edbcfc1a5d4ce037aeb1d1a
parent 0dcbc80f01565bfc3adaff579fd56d3aaae7ab5e
Author: Pablo Escobar Gaviria <gark.garcia@protonmail.com>
Date:   Tue, 21 Jan 2020 13:30:43 -0200

Improved all implementations in functional programming languages by make the calculation of the sum of the digits of the test values tail recursive.

Diffstat:
MElixir/main.ex | 15++++++++-------
Mscript.pl | 6+++---
2 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/Elixir/main.ex b/Elixir/main.ex
@@ -59,18 +59,19 @@ defmodule Conjecture do
     case :ets.lookup(:sums_cache, n) do
       [{_, sum_n}] -> sum_n
       [] ->
-        sum_n = sum n
+        sum_n = sum_digits n
         :ets.insert(:sums_cache, {n, sum_n})
         sum_n
     end
   end
 
-  def sum 0 do 0 end
+  def sum_digits n do sum_digits_tail n, 0 end
 
-  def sum n do
-    d = rem n, 10
-    r = div n, 10
+  def sum_digits_tail 0, acc do acc end
 
-    d + sum r
-  end
+  def sum_digits_tail n, acc do
+    r = rem n, 10
+    d = div n, 10
+    sum_digits_tail d, (acc + r)
+  end 
 end
diff --git a/script.pl b/script.pl
@@ -3,10 +3,10 @@
 % Let S: N -> N be the sum of the digits of a positive integer.
 % For all A and B in N, S(A + B) = S(A) + S(B) - 9k, where k is an integer.
 
-sum_digits(X, Y) :- sum_digits(X, 0, Y).
+sum_digits(X, Y) :- sum_digits_tail(X, 0, Y).
 
-sum_digits(X, Acc, Y) :- X < 10, !, Y is Acc + X.
-sum_digits(X, Acc, Y) :-
+sum_digits_tail(X, Acc, Y) :- X < 10, !, Y is Acc + X.
+sum_digits_tail(X, Acc, Y) :-
     Q = X div 10,
     R = X mod 10,
     Acc1 = Acc + R,