のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

【ネタ】アッカーマン関数によるプログラミング言語最速決定戦?

Sponsored Links

皆さんこんにちは
おげんきですか?私はげんきです。

本日は最速決定戦やります。いやはやC++がはええええとかいいつつ
他の言語どうだっけなんて思う常日頃です。

エントリー

6つの言語で行いました
C++,Java,PHP,Python,Ruby,Javascript

種目

アッカーマン関数の計算
x = 3, y = 9 (以下を参照ください)
計測方法はtimeコマンドを用いた実行方法です。

※アッカーマン関数とは
{ \displaystyle
\begin{eqnarray*}
 &Ack&(0, y) = y + 1 \\
 &Ack&(x+1, 0) = Ack(x, 1) \\
 &Ack&(x + 1, y + 1) = Ack(x, Ack(x+1, y))
\end{eqnarray*}
}

で構成される再帰的な関数です。

判定方法

timeで計測しました。

ソースコード

C++

#include <iostream>
using namespace std;

int ack(int m,int n){
	if(m == 0) return n + 1;
	else if(n == 0) return ack(m-1,1);
	else return ack(m-1,ack(m,n-1));
}

int main(void){
	int a = ack(3,9);
	cout << a << endl;
}

Java

class Ack{
	private int ack(int m,int n){
		if(m == 0) return n + 1;
		else if(n == 0) return ack(m-1,1);
		else return ack(m-1,ack(m,n-1));
	}
	public static void main(String args[]){
		Ack ack = new Ack();
		System.out.println(ack.ack(3,9));
	}
}

PHP

<?php
function ack($m,$n){
	if($m == 0){
		return $n + 1;
	}else if($n == 0){
		return ack($m-1,1);
	}else{
		return ack($m-1,ack($m,$n-1));
	}
}

echo ack(3,9);
?>

Python

import sys

def ack(m,n):
	if m == 0:
		return n + 1
	elif n == 0:
		return ack(m-1,1)
	else:
		return ack(m-1,ack(m,n-1))

if __name__ == '__main__':
	sys.setrecursionlimit(10000)
	print ack(3,9)

Ruby

def ack(m,n)
	if m == 0 then
		return n + 1
	elsif n == 0 then
		return ack(m-1,1)
	else
		return ack(m-1,ack(m,n-1))
	end
end

puts ack(3,9)

Javascript

function ack(m,n){
	if(m == 0) return n + 1;
	else if(n == 0) return ack(m-1,1);
	else return ack(m-1,ack(m,n-1));
}

console.log(ack(3,9));

結果

言語 user sys total
C++ 0.01 0.00 0.01
Java 0.12 0.02 0.14
Php 1.67 0.12 1.79
Python 2.66 0.14 2.80
Ruby 0.91 0.25 1.22
javascript 0.11 0.01 0.12

感想

最適化したC++はやはり早かった。
Javaもやっぱり早いね、次に来るのがjavascriptというのには少し驚いた。
ウェブで使われに使われまくるだけあってえらく早い、スクリプト言語なのに。

僕の大好きなPythonくんが遅すぎて泣きそう。