リファレンスを参考にしつつ、反復回数を100にして実験してみる。
(define n 1)
(define e 0)
(define a 1)
(define max_loop 100)
(do
([i 0 (+ i 1)])
([= i max_loop] [print e])
(begin
#|(print e)|#
(set! e (+ e a))
(set! a (/ a n))
(set! n (+ n 1))
)
)
(print " => " (inexact e))
実行結果は以下の通り。
> gosh .\main.scm
31710869445015912176908843526535027555643447320787267779096898248431156738548305814867560678144006224158425966541000436701189187481211772088720561290395499/11665776930493019085212404857033337561339496033047702683574120486902199999153739451117682997019564785781712240103402969781398151364608000000000000000000000
=> 2.7182818284590455
なんかとんでもない分数になってしまいましたが、肝心の数字は割といい感じに計算できているようです。ていうか自動で改行とかしてくれないんですかこれ。
ちなみにコードをそのまま貼り付けているので二重括弧の部分が勝手に脚注扱いになります。この問題を避けるためにブログ*1なども参考にさせていただいたのですが、結局()を[]に置き換えることで解決しました(Gaucheで動くからいいや)。
そもそもSchemeの型とか分数とか全然わかっていないので基本的なことから学びなおす必要がありそうです。
参考文献