我试图为 Project Euler 的问题 14 编写一个解决方案。我最快的——不是下面那个——跑了 58 秒左右。我使用谷歌发现的最快看起来或多或少是这样的:
%% 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++ 中最快的解决方案只需要 0.18 秒,快了 58 倍。所以我想即使 Erlang 不是为这样的东西而生的,也可以编写更好的代码。有人可能知道我可以尝试什么来提高速度吗?