以前会社でチーム内で誰が早くフィボナッチ数列の計算をプログラミングで行えるか
という遊びの中で書いたやつです。
チームメンバーは各々得意な言語を使って行いましたが、私の場合はElixirでの環境を用意できず。C#で書かせていただきました。
ルールは
フィボナッチ数列50番目の数字を100000回計算させてその後出力させる。
というやつでした。
面白いので皆さんチーム内でやってみてはいかがでしょうか。
c#
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 100000; i++) {
fib(50);
}
watch.Stop();
Console.WriteLine("time" + watch.Elapsed);
Console.WriteLine(fib(50));
Console.Read();
}
static UInt64 fib(int n)
{
UInt64 fib01,fib02;
fib01 = 0;
fib02 = 1;
for (int i = 1; i < n; i++)
{
UInt64 a = fib01 + fib02;
fib01 = fib02;
fib02 = a;
}
return fib02;
}
}
}
Elixir
Elixir で50番目を求めるまでやった時のコード
実際に環境を用意できなかったけれども書いては見ました
defmodule Memorize do
def fib 0 do
0
end
def fib 1 do
1
end
def fib x do
case Agent.get(:fib_memo, &Map.get(&1, x)) do
nil ->
v = fib(x - 1) + fib(x - 2)
Agent.update(:fib_memo, &Map.put(&1, x, v))
v
v -> v
end
end
def start_agent do
Agent.start_link &Map.new/0, name: :fib_memo
end
end
Memorize.start_agent
IO.inspect Memorize.fib 100000
チーム内での結果としてはC++が予想通り速く、案外早かったのはPHP7でした。
厳密にやると色々変わってきそうですがお遊び程度で制限時間を作ってやってみると面白いかもしれません。
ではまた
僕のギスト
https://gist.github.com/ProblemaResolt/716d7a5ed466e72cd80e1edf1cc2e5b9