PostScriptでフィボナッチ数列を計算

PostScriptで再帰が出来るのだからとフィボナッチ数列を計算してみました。

%!
/fib 
 { dup 0 eq { pop 1} {dup 1 eq { pop 1 }
                               { dup 1 sub fib exch 2 sub fib add } ifelse }ifelse
 } def

0 1 20 {fib ==} for
  • else へ値を渡すのには dup によりスタックの値をコピーしなかればまりません。
  • けれども論理地がtrueであってifのブロックで値を返すときは、{ pop 1}のようにコピーした値を捨ててから返します。そうしないと再帰したときにスタックの値がずれます。clear でスタックを空っぽにしてもダメ。
  • { dup 1 sub fib exch 2 sub fib add } このへんは手続きを一つ追加するたびに pstack でスタックの内容を確認しながらの作業です。
$ ps2pdf fib.ps
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946