第3の条件では、lst
を0と比較しています。これは(car lst)
である必要があります。
(list? (car lst))
の条件のため、ネストされたリストを数えたいと思うようです。条件付きでリストの別々の部分が追加されないため、現在の実装では(上記のチェックを修正して)これに問題があります。
例えば、
(num-zeroes '(0 0 (1 0) (1 0 0))) ; => 3
あなたはこのような何か行うことができます。この修正方法:
(define (num-zeroes lst)
(define (helper lst sofar)
(cond ((null? lst) sofar)
((list? (car lst)) (+ sofar ;; add sofar to
(helper (car lst) 0) ;; branched out first part
(helper (cdr lst) 0))) ;; and branched rest
((eq? (car lst) 0) (helper (cdr lst) (+ 1 sofar))) ;; (car lst), not lst
(else
(helper (cdr lst) sofar))))
(helper lst 0))
これはにつながる:今すぐ
(num-zeroes '(0 0 (1 (1 (0 0) 0)) (1 0 0))) ;; => 7
、あなたが望むあなたの問題のバリエーションをコレクション上で何かを行い、蓄積された価値を大量に維持すること。 fold
は、これらの問題のために特別に設計された高次関数です。
Foldは、2つの引数(要素とアキュムレータ)、開始値、およびコレクションを持つ関数をとります。関数をコレクションの各要素に順番に適用し、最後にアキュムレータを返します。
あなたのケースでは、それが唯一のfoldl
に(flatten
リストからネスティングを削除する)要素が0であるとき、アキュムレータに1を追加し、平坦化リストを渡すことが可能です(https://docs.racket-lang.org/reference/pairs.html#%28def._%28%28lib._racket%2Fprivate%2Flist..rkt%29._foldl%29%29を参照してください)(lは、それはリストを歩くこと
(define (num-zeroes2 lst)
(foldl (lambda (e acc)
(if (= e 0)
(+ acc 1)
acc))
0
(flatten lst)))
これは、同じ結果につながる:
(num-zeroes2 '(0 0 (1 (1 (0 0) 0)) (1 0 0))) ;; => 7
それとも、それについて考えて、あなたがすることもでき01ネスティングに対処するための右にリットル EFT)からリストとアウトfilter
0に等しいすべての値(ライブラリー法は、そのためのzero?
が呼ばれる)、および要素を数える:
(define (num-zeroes3 lst)
(length
(filter zero? (flatten lst))))
・ホープ、このことができます。
'eq?'は、あなたがそう思っていることをしません:http://stackoverflow.com/q/16299246/124319 – coredump
'(ヘルパー(car lst)sofar)':その場合の 'cdr'はどうでしょうか? – coredump
それは何も変わらなかった。 –