激凹みから立ち直る方法

あるLispの勉強ソフトで、

「関数lを『引数としてxを受け取ると、xの要素の数を返す関数』として定義しなさい。」

という問題があるのですが、私は以下のようにしました。

(define l (lambda (x) (if (= x null?) 0 (+ 1 (l (cdr x))))))

しかしこれだとオーバーフローと表示されて強制終了されてしまいました。
そこで答えをネットで検索したところ以下のものが見つかりました。

(define l (lambda (x) (cond ((null? x) 0) (else (+ 1 (l (cdr x)))))))

これが正解なようですが、この2つのリストの違いがわかりません。
初歩的なことですがifの使い方を間違っているんでしょうか?

A 回答 (1件)

間違えているのは「if の使い方」ではなく「条件の書き方」です.


あなたが書いたのは「x と null? の値が等しいときに 0 を, そうでないときに (+ 1 ...) を返す」という関数です. さて, じっと考えてください. 「x と null? の値が等しい」ことはありえますか?
「答え」にあるのは「x が nil なら 0, そうでなければ (+ 1 ...) を返す」という関数です. これを if で書くと
(define l (lambda (x) (if (null? x) 0 (+ 1 (l (cdr x))))))
です.
    • good
    • 0
この回答へのお礼

よくわかりました

ありがとうございました

お礼日時:2009/05/18 00:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報