Common Lisp 関数のみを使用して、s 式に含まれる s 式の数をカウントする関数を作成しようとしています。例えば:
((x = y)(z = 1)) ;; returns 2
と
((x - y)) ;; returns 1
ネストされた式が可能です:
((if x then (x = y)(z = w))) ;; returns 3
長さを見つける関数を書きましたが、ネストされた式がない場合に機能します。それは:
(define (length exp)
(cond
((null? exp) 0)
(#t (+ 1 (length (cdr exp))))))
ネストされた式を次のようにサポートするために、これを変更しました。
(define (length exp)
(cond
((null? exp) 0)
((list? (car exp)) (+ 1 (length (cdr exp))))
(#t (length (cdr exp)))))
これは、ネストのない式で機能しますが、ネストされた式の答えより常に 1 少なくなります。これは、上記の例の を例にとると((if x then (x = y)(z = w)))
、これは最初に を見てif
、3 番目の条件を満たし、cdr (式の残りの部分をリストとして) を に返すためlength
です。(x=y) に達するまで同じことが起こり、その時点で a+1
が返されます。これは、式(if x then .... )
がカウントされていないことを意味します。
どのような方法でそれを説明できますか? 追加+2
すると、ネストされていない式が過大にカウントされます。
ネストはどこでも発生する可能性があるため、1 つの関数でこれを機能させる必要があります。
((x = y) (if y then (z = w)))