3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

最短(?)のフィボナッチ数列計算プログラム

Last updated at Posted at 2019-01-10

swap over +

 ただこれだけ。これで次々にフィボナッチ数列が計算できる。
これ以上に短いプログラムでフィボナッチ数列が計算できる言語・方法があるのかは正直良くわからないが、そこそこに短い方ではないかと思う。ちなみに対象の言語は Forth と Paraphrase である。

 このプログラムはあくまでも計算するだけである。
しかし、計算すればその結果を見たくなるのが人情というものである。
なので、計算結果を表示させると以下のコードとなる(少し長くなった)。

swap over + dup .

 実際に計算させてみると以下のようになる。このコードで使用しているワードは Forth とコンパチ(なハズ)なので、今回は拙作のParaphrase を用いた(行頭の > は Paraphrase インタプリタのプロンプトである)。

> 1 1 // F1 F2 をスタックに積む
 ok.
> swap over + dup .
 2 ok.
> swap over + dup .
 3 ok.
> swap over + dup .
 5 ok.
> swap over + dup .
 8 ok.
> swap over + dup .
 13 ok.
> swap over + dup .
 21 ok.
> swap over + dup .
 34 ok.
> swap over + dup .
 55 ok.
> swap over + dup .
 89 ok.

なぜ計算できるのか? その仕組の解説

スタックの上から 2 番目(セカンド)に F_{n-1} が、1 番上(TOS=Top Of Stack)に F_n が格納されているとする。

+---------+
| F_n     |
+---------+
| F_{n-1} |
+---------+

swap で、

+---------+
| F_{n-1} |
+---------+
| F_n     |
+---------+

となり、over で、

+---------+
| F_n     |
+---------+
| F_{n-1} |
+---------+
| F_n     |
+---------+

となり、+ にて、

+----------------------------+
| F_n+F_{n-1} つまり F_{n+1} |
+----------------------------+
| F_n                        |
+----------------------------+

を得る。

Forth では、スタックの変化前と変化後を --- というキーワードを用いて表現する。
この記法を用いると、swap over + というプログラムは、

F_{n-1} F_n --- F_n F_{n+1}

という変化をスタックにもたらす。

おわりに

 Forth は長い歴史を持つ言語である。そのため、おそらくここに書かれているようなことは既に誰かがとうの昔に書いている可能性も高い。もしご存知の方がいたら、コメント欄にでも書いていただければ幸いである。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?