1

リスト内のすべてのアイテムをカウントするScheme関数を作成しようとしていますが、使用可能な長さ関数とは異なり、内部リストもカウントするため、 countAll '(a (ab)) は2ではなく3を返します.

最初のチェックは空のリストのためのもので、2番目はリストの先頭が現在リスト自体であるかどうかをチェックすることになっています。次に、そのリストの長さを合計に追加し、そうでない場合は次の再帰呼び出しを呼び出す必要があります。 t、合計に1を追加して関数を再帰的に呼び出す3番目の部分にスキップするだけです。

構文エラーが発生しており、自分のアプローチについて確信が持てません。私はこれを正しい方法で行っていますか?これを行うためのより良い/より簡単な方法はありますか?

(define countAll 
  (lambda (list)

    (if (null? list)
        0

        ((if (list? (car list)
                    (+ length (car list)
                       (countAll (cdr list))))))

        (+ 1
           (countAll (cdr list))))))     
  (+ 1
   (countAll(cdr list)
  )))))
4

3 に答える 3

2

あなたは括弧を台無しにしました。次のように、 condを使用してこれを書き直すことを強くお勧めします。

(cond
  ((null? lst) 0)
  ((list? (car lst)) (???))
  (else (???)))

これにより、何をしているのかが見やすくなり、括弧を台無しにする可能性がはるかに低くなります。ネストされた if は、最も単純な状況を除いて、避けるべきものです。

あなたのアプローチはほぼ正しいですが、何かを見逃しています。がtrue と評価されたときに何が起こるかについて、大きな仮定を立てました。(list? (car lst))それが何だと思いますか?よくよく考えてみると、ここでは長さ関数を使用できないことがわかります。

于 2012-10-22T15:21:52.790 に答える
1

この種の問題の解決策は、リストのリストをトラバースするためのよく知られた構造 (必要に応じてレシピ) に従います。これは宿題のように見えるので、一般的なアイデアについては私がお手伝いします。空欄を埋めてください。

(define (countAll lst)
  (cond ((null? lst)               ; if the list is empty.
         <???>)                    ; then it doesn't have any elements
        ((not (list? (car lst)))   ; if the first element in the list is not a list
         (<???> (countAll <???>))) ; add one and advance the recursion over the `cdr`
        (else                      ; otherwise
         (+ (countAll <???>)       ; add the result of the recursion over the `car`
            (countAll <???>)))))   ; with the result of the recursion over the `cdr`

リストのリストを扱うこの種の問題に対する解決策を構築する方法を理解するための助けがさらに必要な場合は、The Little SchemerまたはHow to Design Programsのいずれかを参照することをお勧めします。一般的なプロセス。

于 2012-10-22T16:32:06.123 に答える