2016-10-18 12 views
1
(define (num-zeroes lst) 
(define (helper lst sofar) 
(cond ((null? lst) sofar) 
    ((list? (car lst)) (helper (car lst) sofar)) 
    ((eq? lst 0) (helper (cdr lst) (+ 1 sofar))) 
    (else 
    (helper (cdr lst) sofar)))) 
(helper lst 0)) 

この関数は、リスト内の0の数を数えたとします。しかし、値を入力すると0を与え続けます。どのように私はこれを修正することができますか?スキーム内のリスト内のゼロの数をカウントする

+0

'eq?'は、あなたがそう思っていることをしません:http://stackoverflow.com/q/16299246/124319 – coredump

+0

'(ヘルパー(car lst)sofar)':その場合の 'cdr'はどうでしょうか? – coredump

+0

それは何も変わらなかった。 –

答えて

1

第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)))) 

・ホープ、このことができます。

+0

これは味わいの問題ですが、 'num-zeroes3'は' compose'を使用してより合理化することができます。例えば'((長さ(curry filter zero?)flatten)lst)' – pdoherty926

+0

@ pdoherty926私はSchemeでの作文については知らなかったが、ネストは良く見えなかった。 :) –

関連する問題