変な記号の関数もこれで最後だ。
↑
↑は累乗だ。o^と書こう。(o^ n m) は m が0になるまで1ずつ減らしながら n をかけていけばいい。
(use mymodule)
(define o^
(lambda (n m)
(cond
((zero? m) 1)
(else (o* n (o^ n (sub1 m)))))))
(print (o^ 2 3))
(print (o^ 2 8))
実行:
^o^ > gosh -I. exp.scm 8 256
÷
次は割り算。o/ と書こう。これは関数の定義がさき出てきてしまうので素直に写経。
(use mymodule)
(define o/
(lambda (n m)
(cond
((o< n m) 0)
(else (add1 (o/ (o- n m) m))))))
(print (o/ 9 3)) (print (o/ 10 3))
実行:
^o^ > gosh -I. quo.scm 3 3
今までの関数と違って、終了条件が zero? じゃない。この定義だとあまりは捨てられてしまう。ま、整数の割り算って、Ruby や Python でもそうか。