Project Eulerの問題14の解決策を書いてみました。私の最速(以下のものではありません)は、58秒ほどで実行されました。Google を使用して見つけた最速のものは、多かれ少なかれ次のように見えました。
%% ets:delete(collatz) (from shell) deletes the table.
-module(euler) .
-export([problem_14/1]) .
collatz(X) ->
case ets:lookup(collatz, X) of
[{X, Val}] -> Val ;
[] -> case X rem 2 == 0 of
true ->
ets:insert(collatz, {X, Val = 1+collatz(X div 2)} ) ,
Val ;
false ->
ets:insert(collatz, {X, Val = 1+collatz(3*X+1)} ) ,
Val
end
end .
%% takes 10 seconds for N=1000000 on my netbook after "ets:delete(collatz)".
problem_14(N) ->
case ets:info(collatz) of
undefined ->
ets:new(collatz, [public, named_table]) ,
ets:insert(collatz,{1,1}) ;
_ -> ok
end ,
lists:max([ {collatz(X), X} || X <- lists:seq(1,N) ]) .
ただし、空のテーブルでは 10.5 秒かかります。私が見つけた C++ での最速のソリューションは、58 倍速い 0.18 秒しかかかりません。したがって、Erlang がそのようなもののために作られていない場合でも、より良いコードを書くことができると思います。速度を上げるために私が何を試みることができるか誰かがおそらく知っていますか?