2

代入ステートメントを使用せずにリスト内の奇数の数を返す関数をSchemeで書くのに問題があります。述語oddを使用しようとしていますか? 同じように。ヘルプ/ヒントをいただければ幸いです。

例: (オッズ '(1 2 3 4 5) // 3 を返す

また、リストは整数です

4

5 に答える 5

4

割り当てステートメントを使用できない場合でも、組み込みプロシージャを使用できます。特に、countRacket ではうまく機能します。

(define (odds lst)
  (count odd? lst))

...しかし、ソリューションをゼロから実装することになっていると思います。自分で解決策を見つけるためのいくつかのヒント、空欄を埋めてください:

(define (odds lst)
  (cond (<???>                 ; if the list is empty
         <???>)                ; then how many odd numbers are in it?
        ((odd? <???>)          ; if the first element is odd
         (<???> (odds <???>))) ; then add one and advance recursion
        (else                  ; otherwise
         (odds <???>))))       ; just advance the recursion

とにかく、期待どおりに動作します:

(odds '(1 2 3 4 5))
=> 3
于 2013-06-25T18:44:33.147 に答える
0

以下は、述語に基づいて何かをカウントする関数を返す関数です。

(define (counter-for predicate)
  (define (counting list)
    (if (null? list)
        0
        (+ (if (predicate (car list)) 1 0)
           (counting (cdr list)))))
   counting))

次のように使用されます。

(define odds (counter-for odd?))

[その他のオプション]これは素晴らしい再帰的解決策です

(define (odds list)
  (if (null? list)
      0
      (+ (if (odd? (car list)) 1 0)
         (odds (cdr list)))))

ここに末尾再帰ソリューションがあります:

(define (odds list)
  (let odding ((list list) (count 0)))
    (if (null? list)
        count
        (odding (cdr list)
                (+ count (if (odd? (car list)) 1 0))))))

以下は、述語に基づいて何かをカウントするルーチンです。

(define (count-if predicate list)
  (if (null? list)
      0
      (+ (if (predicate (car list)) 1 0)
         (count-if predicate (cdr list)))))
于 2013-06-26T03:14:47.510 に答える