情報科学概論IIA 電子・情報工学系 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/Joka2a-1998/1998-06-09
あるいは、次のページから手繰っていくこともできます。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/
http://www.hlla.is.tsukuba.ac.jp/~yas/index-j.html
先週の課題(教科書62ページ〜67ページの「6.7演習問題」)のチェック・ ポイント
授業時間中に、教官、TA、隣の人などを使って、疑問点を解決するように。
単に結果だけでなく、日本語で説明をいれるように。
Lisp のプログラムを書く時に、tab を使うと自動的にきれいな字下げ(段付 け)をしてくれます。
(define f (lambda (x) ....))
(define (f x) ....)
(f .... )けっこう、次のように書いて、エラーになっている人がいます。
f( .... )あと、括弧の一番左側は、手続きの名前だということに注意してください。
(lambda (x) ... (x .... ) )こう書くと、x という変数の値を関数だと思って実行するという意味になりま す。
lambda の本体は、括弧で括る必要はありません。たとえば、次の例は、引数 を1つ取るのですが、どんな引数が与えられても 1 を返す手続きです。
(lambda (x) 1)これを、次のようにかいてはいけません。
(lambda (x) (1))
線形再帰なので、! (56ページ)と同じパタンで作れます。これは、線形再帰な ので、末尾再帰にもできます。(末尾再帰にしようと思ってもできないものも あります。) (do .... ) でループで書いてもかまいません。
「等しい」かどうかの判定には、equal? が便利です。 再帰で1つひとつ eq? で調べる方法もあります。 ただし、= では、記号は比較できません。= は、数専用です。
#t や #f を返すには、 #t, '#t, #f, '#f, と書きます。
((lambda () '#t))
(define (reverse x) (define (rev x acc) (if (null? x) acc (rev (cdr x) (cons (car x) acc)))) (rev x '()))
次のような述語で、場合わけをします。 (全部使う必要はありません。2つ使えば普通は足ります。)
(null? x) (pair? x) (atom? x)
あとは、ひたすら場合わけと再帰です。
To: yas Subject: [joka2a] enshuu-6.7
余裕がある人は、「6.7演習問題」や、84ページの 演習問題8.3に進みなさい。