[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bep] learning lisp: recursive
- To: bep@argv.org
- Subject: Re: [bep] learning lisp: recursive
- From: Reiko TAKAHASHI <HFC03614@nifty.ne.jp> (高橋玲子)
- Date: Tue, 19 Jun 2001 07:35:36 +0900
- Delivered-To: mailing list bep@argv.org
- Mailing-List: contact bep-help@argv.org; run by ezmlm
r高橋です。
Reply TAKAHASHI Naoto <ntakahas@...>'s message:
} 整数かどうかをチェックするには integerp という関数を使います。
} 数値の大小を比較する関数は < , > , <= , >= なんかがあります。
} 「AかつB」という条件は (if (and A B) ...) と書きます。
}
} 以上がヒントです。後は C-h f を駆使すれば引数が1以上の整数かどうか確か
} められますね。
}
} 練習問題:
} 前出の fact に変更をほどこし、引数が1以上の整数でなければ nil を返すよ
} うにせよ。
考えてみました。
(defun fact (n)
(if (and (integerp n) (>= n 1))
(if (= n 1)
1
(* n (fact (- n 1))))))
でしょうか?
(if ...)の中身について、条件式を評価した結果が t の場合どうするかのS式さ
えあれば、nil の分のS式はべつになくてもいいんだ、ということが、教えていた
だいていたはずなのに初め思いつけず、「うわっ、nil の分はどうしよう……」
と最初少し悩みました。
上のLISPを*scratch*でC-jしてから、(fact ...) にいろいろな数を入れて遊ん
でみました。
私のところでは、n の値が11を超えてしまうと、返ってくる値が負の数になっ
たり、正の数でもへんな値になったりするみたいなのですが……(DOS版Emacsで
す(^^;;;))。
} 多分最初の頃の if は (if 条件式 S式その1 S式その2) としか書けなかった
} んじゃないでしょうか。その後アドホックに「S式その3」以降を追加したんで
} しょうね。
……なるほど、そういうことだったんですね。
} > (if ...)の中で、(if ...)を使うことはできますか?
} > ある条件式が nil だったもののうち、別の条件式も nil だったものだけについ
} > てなにかの操作をしたい場合とかがありそうな気がするのですが……(DOSのバッ
} > チファイルだと、そういうことがときどきあるので(^_^;))。
……実は、もうこの時点で私は、「条件式が t だった場合の分だけS式があれ
ばいい」ということを忘れて(?)いたみたいです。
} もちろん if を重ねることもできます。なにしろ (if ...) もS式のひとつで
} すから。なお、複雑な条件判定をするときには、if より便利な cond を使う
} ことがよくあります。でも cond の紹介は上の練習問題ができた後ですね。
----------
cond is a built-in function.
(cond CLAUSES...): try each clause until one succeeds.
Each clause looks like (CONDITION BODY...). CONDITION is evaluated
and, if the value is non-nil, this clause succeeds:
then the expressions in BODY are evaluated and the last one's
value is the value of the cond-form.
If no clause succeeds, cond returns nil.
If a clause has one element, as in (CONDITION),
CONDITION's value if non-nil is returned from the cond-form.
----------
ううん……、??です。
} 最初は速度は気にしなくていいと思います。プログラムで一番大事なのは正し
} い答を出すことで、次が読み易さだと思って下さい。
はい、わかりました。「正しい答を出すこと」、ほんと、そうですよね。
**-***-***-***-***-***-***-***-***-***-***-***-**
Reiko TAKAHASHI (高橋玲子)
E-mail: HFC03614@...
ICQ UIN: 85924121 (Twinkle)
**-***-***-***-***-***-***-***-***-***-***-***-**