• 締切済み

scheme

リストに含まれる記号の数を求める手続きを作りたいのですが。 (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))))) これだとうまくいきませんでした。 おねがいします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

pikapika12
質問者

補足

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

noname#29459
noname#29459
回答No.1

なんかの課題くさいので、考え方だけ、かいときますね。 count(x) とは、  (car x)が記号かどうかの判定結果 + count(cdr x) である。

関連するQ&A