1
(cons 2 (cons ( cons 2 3 ) (cons 4 5 )))

これにより、次のようなリストが表示されます。(2 (2 . 3) 4 . 5)このリストの要素数をカウントしようとすると、出力は3期待どおりになります。

ペアの個々の要素の数を計算するにはどうすればよいですか?この場合の出力は5、たとえばです。

4

2 に答える 2

1

考えられる解決策は次のとおりです。問題は、基本的にリスト構造内のアトムの数を尋ねることです(必ずしもnullで終了する適切なリストである必要はありません)。

(define (count-all seq)
  (cond ((null? seq) 0)
        ((not (pair? seq)) 1)
        (else (+ (count-all (car seq))
                 (count-all (cdr seq))))))

これは、次のような要素のシーケンスで機能します。

  • シーケンスが空の場合、要素はゼロです
  • シーケンスがconsセル(要素のペア)でない場合、それは単一の要素(アトム)であるためです
  • それ以外の場合は、シーケンスのcarとの両方の要素を追加しますcdr

これは、任意にネストされたリスト構造に対して期待どおりに機能します。

(count-all '(2 (2 . 3) 4 . 5))
=> 5

(count-all '(1 (2 . (3 (4 . 5) 6)) 7 . 8))
=> 8
于 2013-01-14T20:10:36.100 に答える
0

この問題は、任意に深くネストされたリストに対して再帰的に解決できます。

(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

編集: これはオスカーの答えと重複しています。送信を押したときに彼が答えたのはわかりませんでしたが、コメントが役立つと思うので、ここに残しておきます。

于 2013-01-14T20:24:19.197 に答える