[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bep] learning lisp: recursive



 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)
**-***-***-***-***-***-***-***-***-***-***-***-**