見出し画像

Retro-gaming and so on

プログラムにはたらい回しがある

また素振りブログを読んでたんですが。


なんかもうタイトル見ただけで。

「スウェーデンにはたらい回しがなくてもプログラムにはあるぞ。」

とか思っちゃって(笑)。
すんません。

Pythonで書いたたらい回し関数は以下のような感じである。

def tarai(x, y, z):
 if x <= y:
  return y
 else:
  return tarai(tarai(x-1, y, z), tarai(y-1, z, x), tarai(z-1, x, y))

ISO/JIS FullBasicで書くと以下のような感じである(実装はこちらからダウンロード)。

DECLARE EXTERNAL FUNCTION tarai
INPUT x, y, z
PRINT tarai(x, y, z)
END
EXTERNAL FUNCTION tarai(x, y, z)
IF x <= y THEN
 LET tarai = y
ELSE
 LET tarai = tarai(tarai(x-1, y, z), tarai(y-1, z, x), tarai(z-1, x, y))
END IF
END FUNCTION

C言語で書けば以下のようなカンジだ。

int tarai(int x, int y, int z) {
 if (x <= y) {
  return y;
 } else {
  return tarai(tarai(x-1, y, z), tarai(y-1, z, x), tarai(z-1, x, y));
 }
}

いずれにせよ、内部で再帰しまくりなのでクッソ重い。
PythonでもISO/JIS FullBasicで書いたコードでも計算結果が出るまでしこたま時間がかかる。
例えばPython版ではtarai(12, 6, 0)の計算結果が出るのをしばらくボーッと待たないとならないのだ。これは昨今のPCの性能を考えるとかなり驚くべき話である。
たった、「12」と言う結果を得るだけ、なのに。
その間、たらい回されてるのだ。スウェーデンにはたらい回しがなくてもプログラムではたらい回されてるのである。

なお、驚いた事に、C言語版が一番速かった。計算があっという間に終わった。
C言語は再帰が苦手な癖に、しっかりと素早く計算を終わらせてくれたので、ちと見直したトコロである。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事