(cons 2 (cons ( cons 2 3 ) (cons 4 5 )))
これにより、次のようなリストが表示されます。(2 (2 . 3) 4 . 5)
このリストの要素数をカウントしようとすると、出力は3
期待どおりになります。
ペアの個々の要素の数を計算するにはどうすればよいですか?この場合の出力は5
、たとえばです。
考えられる解決策は次のとおりです。問題は、基本的にリスト構造内のアトムの数を尋ねることです(必ずしもnullで終了する適切なリストである必要はありません)。
(define (count-all seq)
(cond ((null? seq) 0)
((not (pair? seq)) 1)
(else (+ (count-all (car seq))
(count-all (cdr seq))))))
これは、次のような要素のシーケンスで機能します。
car
との両方の要素を追加しますcdr
これは、任意にネストされたリスト構造に対して期待どおりに機能します。
(count-all '(2 (2 . 3) 4 . 5))
=> 5
(count-all '(1 (2 . (3 (4 . 5) 6)) 7 . 8))
=> 8
この問題は、任意に深くネストされたリストに対して再帰的に解決できます。
(define (atom? x) (not (pair? x)))
(define (count-atoms lst)
(cond ((null? lst) 0) ; nothing to count, return 0
((atom? lst) 1) ; lst contains only one thing, return 1
(else ; otherwise, lst contains multiple elements
(+ (count-atoms (car lst)) ; add the number of atoms in the first position
(count-atoms (cdr lst)))))) ; to the number of atoms in the rest of the list
編集: これはオスカーの答えと重複しています。送信を押したときに彼が答えたのはわかりませんでしたが、コメントが役立つと思うので、ここに残しておきます。