今回の課題を解くに当たって、「cons」「car」「cdr」「list」「null?」「pair?」以外のリストを受け取る組込み関数(「reverse」や「append」など)を用いてはいけません。必要があれば、相当する関数を自分で定義して使ってください。
以下の各リストが与えられた時に、「car」と「cdr」を組み合わせてリスト中の3を取り出す式を示せ。「cddr」などaやdを複数含む関数を利用してもよい。
(1 2 (3 4) 5)
((3))
(1 (2 (4 (5 (6 (7 3))))))
(11/3 追記: それぞれの式は関数「f1」「f2」「f3」として定義してください。既に提出頂いた分はそのままで大丈夫です。)
> (f1 '(1 2 (3 4) 5))
3
> (f2 '((3)))
3
> (f3 '(1 (2 (4 (5 (6 (7 3)))))))
3
締切: 11/14 23:59
数のリストを受け取って、その和を返す関数「sum-total」を定義せよ。
実行例:
> (sum-total (list 1 2 3 5))
11
締切: 11/14 23:59
組み込み関数「reverse」と同様の関数、つまり、リストを受け取って逆順のリストを返す関数「my-reverse」を定義せよ。
注: 例年、下記実行例において((((5 . 4) . 3) . 2) . 1)という答えが出力されるプログラムが提出されるが、正しい答えではない。また、空リストが与えられた際にも、reverseと同じ挙動を示すように実装せよ。
実行例:
> (my-reverse (list 1 2 3 4 5))
(5 4 3 2 1)
締切: 11/14 23:59
組み込み関数「assoc」と同様の関数、つまり、連想リストからキーの合致する要素を取り出す関数「my-assoc」を定義せよ。
注: 課題S11と同様、空リストが与えられた際にも、組み込み関数のassocと同じ挙動を示すように実装せよ。
実行例:
> (define alist '((1 . "One") (2 . "Two") (3 . "Three")))
> (my-assoc 2 alist)
(2 . "Two")
> (my-assoc 4 alist)
#f
(11/6 追記: 連想リストのキーは数値だけとは限りません。文字列やリストなどがキーになっている場合でも組み込み関数のassocと同じ挙動を示すようにしてください。)
締切: 11/14 23:59
以下で定義される「my-fold」を使って、「reverse」と同様の働きをする関数「my-reverse2」を定義せよ。
(define (my-fold op init l)
(if (null? l)
init
(my-fold op (op (car l) init) (cdr l))))
締切: 11/14 23:59