処理系の実行中に次の式を入力すれば、現在のディレクトリにあるlib.scmの内容を実行します。絶対パスや相対パスを使って任意のファイル名を指定することもできます。ただし、普通に処理系で実行する場合と違って、実行結果は出力されません。
(load "./lib.scm")
シェル命令で以下のようにオプションを書けば、Guileの起動時にloadを実行することもできます。
guile -l lib.scm
ただし、バージョン2.xのGuileでloadを使うと、自動的にファイルがコンパイルがされ、今後の実行のために保存されます。もしこの自動コンパイル機能を止めたい場合は、「--no-auto-compile」というオプションを付けてguileを実行してください。
正の整数を2つ受け取って、それらの最大公約数を返す関数「my-gcd」を定義せよ。(ただし、既存のgcd関数を利用してはならない。(10/21追記))
実行例:
> (my-gcd 9801 1287)
99
締切: 11/10 23:59
非負の整数nを受け取って、n番目のフィボナッチ数を返す関数「fib」を定義せよ。ただし、「(fib 0)」の評価結果は0、「(fib 1)」の評価結果は1となるようにすること。
実行例:
> (fib 11)
89
締切: 11/10 23:59
関数「plus-naive」と「plus-tail-rec」を次のように定義する。これらはどちらも自然数の和を計算する関数だが、処理系のスタックの使い方に違いがある。この違いについて説明せよ。レポートはテキストファイルとして作成すること。レポート課題としての注意事項は課題C36と同様である。
(define (plus-naive a b)
(if (<= a 0)
b
(+ (plus-naive (- a 1) b) 1)))
(define (plus-tail-rec a b)
(if (<= a 0)
b
(plus-tail-rec (- a 1) (+ b 1))))
締切: 11/10 23:59
課題S4と同じくフィボナッチ数を計算する関数「fib2」を末尾再帰で定義せよ。(定義した全ての関数について、関数の再帰的利用が全て末尾再帰になっている必要がある。)
実行例:
> (fib2 44)
701408733
締切: 11/10 23:59
関数f(x)の導関数f'(x)はdxが十分に小さい時、f'(x) = (f(x+dx) - f (x))/dxとして近似する事が可能である。この事実を利用して、1引数関数fと小さい数dxを受け取ってその導関数を返す関数である「deriv」を定義せよ。また、「deriv」を利用することで、資料13Pにあるnewton-iter関数を変更し導関数を引数として受け取らないnewton-iter2を作成せよ。ただし、dxは0.0001を固定して用いてよい。(必要であれば、good-enough?関数やimprove関数を変更してよい)
実行例:
> (define (square x) (* x x))
> ((deriv square 0.0001) 3)
6.000100000012054
> (define (sqrt3 x) (newton-iter2 (sqrt-base x) 1.0))
> (sqrt3 2)
1.4142135624530596
締切: 11/10 23:59
1引数関数fとgを受け取って、合成関数gfを返す関数composeを定義せよ。
実行例:
> ((compose (lambda (x) (+ x 1)) (lambda (x) (* x x))) 2)
9
締切: 11/10 23:59