副作用を持つプログラム

情報科学概論IIA

                                       電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/Joka2a-1998/1998-06-16
あるいは、次のページから手繰っていくこともできます。
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 を使うと自動的にきれいな字下げ(段付 け)をしてくれます。tab は、単なる字下げではなく、既存の行を整え流働き もあります。

define や if では適当に改行してください。横幅80桁で見やすいように。

(define (f x)
  (if ...
      xxx
      ...))

関数名は、考えてつけること。f は不可。

プログラムを書く時に、filename.scm のように、.scm という名前で終るファ イルに保存するようにしてください。その中で tab を打つと、自動的にきれ いに段付けしてくれます。

◆再帰

再帰のプログラムでは、自分自身を信じること。自分が完成したと思って、 (f (car x)) とか (f (cdr x)) のように呼び出します。 そして、それができたと思って、1ステップ進める手続きを かきます。後は、再帰が止る所の条件を考えます。

◆let

let をうまく使うと、プログラムがみやすくなります。たとえば、次のように (car x) がたくさん出てきたとします。
(define (f x)
  ... (car x)
  ....  (car x) ....
  ... (car x) ...
)
これは、次のように let を使うとまとめられます。

(define (f x)
  (let ((a (car x)))
  ... a
  ....  a ....
  ... a ...
))

let には、見やすくする効果の他に、速度的な効果もあります。(car x) くら いですと速いので、あまり問題になることはありません。しかし、複雑な計算 をするような手続きの場合には、何度も何度も呼び出すと遅くなります。これ を let で定義しておけば、手続きは一度しか実行されません。

◆atomcount

普通、car 部と cdr 部は、対称系に書きます。そうなると、末尾再帰にはな りません。cdr 部分だけ末尾再帰にすると、読みにくいです。

◆depth

まず引数を、consセルから作られた2進木だと思って、深さを計算するプログ ラムを考えて見ます。基本的には、次のようになります。

この他に、'() やアトムについて適宜 depth を決める必要があります。

教科書の depth は、上の depth のうち、cdr 部分については、 1 を足さないようなものです。

◆mymax

mymax の中で max を使うのは、ちょっと問題の趣旨とは違います。

◆member

66ページ問題31(a) のin? の部分に、member を使うなと書いてあります。 他の問題でも、in? か member を使うと簡単になります。
> (member 'b '(a b c))
(b c)
> (member 'z '(a b c))
#f
> (member 'a '(a b c))
(a b c)
>

◆条件

条件では、#f 以外は、#t と同じ働きがあります。 () も #t であることに注意してください。
> (if 'a 0 1)
0
> (if #f 0 1)
1
> (if () 0 1)
0
>

■今日の課題

教科書84ページ〜86ページの「8.3演習問題」の練習問題の いくつかをやりなさい。 時間内にできたものについて、プログラムと実行結果を次のような電子メール で送りなさい。
To: yas
Subject: [joka2a] enshuu-8.3

余裕がある人は、89ページの演習問題9.3に進みなさい。


Last updated: 1998/06/16 13:34:50
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>