代入ステートメントを使用せずにリスト内の奇数の数を返す関数をSchemeで書くのに問題があります。述語oddを使用しようとしていますか? 同じように。ヘルプ/ヒントをいただければ幸いです。
例: (オッズ '(1 2 3 4 5) // 3 を返す
また、リストは整数です
割り当てステートメントを使用できない場合でも、組み込みプロシージャを使用できます。特に、count
Racket ではうまく機能します。
(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
以下は、述語に基づいて何かをカウントする関数を返す関数です。
(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)))))