アプリ版:「スタンプのみでお礼する」機能のリリースについて

リストに含まれる記号の数を求める手続きを作りたいのですが。

(0 -1 -2 -3) この場合は0を返す

(pooh piglet 2001)  この場合は2を返す

(1192 538 (owl rabbit))  この場合は2を返す


再帰を使うのですがうまくいきません。
1つめと2つめの例はできるのですが、3つめは中にリストがあって
そのリストの中も数えるところがよくわかりません。

(define (count x)
(if (null? x) 0
(if (number? (car x))
(count (cdr x))
(+ (count (cdr x) 1)))))

これだとうまくいきませんでした。
おねがいします。

A 回答 (2件)

その最後の例だと, count を再帰したときに引数は


(1192 538 (owl rabbit))→(538 (owl rabbit))→((owl rabbit))
と変化していきますよね. つまり, 「(car x) がリストのときにはその中も調べる」という処理が必要です.
ドットペアを考慮する必要があるならそれなりな処理も追加.

この回答への補足

(if (list? (car x))
(+ (count (caar x) 1)

リストの中を調べるとき
((owl rabbit)) の owl を取り出したいのですが
caar だと owl だけ出してしまってそこで終了してしまいます・・・

補足日時:2008/10/02 19:48
    • good
    • 0

なんかの課題くさいので、考え方だけ、かいときますね。



count(x) とは、
 (car x)が記号かどうかの判定結果 + count(cdr x)

である。
    • good
    • 0

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