■変数を変化させる例
variable fn ok
: fact 1 fn ! 11 1 ?do fn @ i * fn ! loop fn @ . ; ok
fact 3628800 ok
コメント:変数と?do-loopを使った手続き言語っぽい例
■スタック操作だけの例
: fact begin swap over * swap 1- dup 1 = until drop . ; ok
10 9 fact 3628800 ok
コメント:Forthっぽくスタック操作で計算した例
■再帰バージョン
<gforthのマニュアルのサンプル>
: fact dup 0> if dup 1- recurse * else drop 1 endif ; ok
10 fact . 3628800 ok
コメント:再帰を使い、さらに階乗の定義にそった形で返す
<改造版>
: fact dup 1 > if dup 1- recurse * endif ; ok
10 fact . 3628800 ok
コメント:シンプルにはなったが、0! = 1 というお約束には対応せず
<スタックをあまり深くしないバージョン>
: fact 1- dup 1 > if swap over * swap recurse else drop endif ; ok
10 10 fact . 3628800 ok
コメント:スタックは最大4段しか使わないが、経過を追うのがややこしい(入
れ替えマニア向け)
確認:gforth 0.7.0