Scheme编写一个返回列表中奇数个数的函数

时间:2013-06-25 18:41:12

标签: scheme racket

我在使用Scheme编写函数时遇到问题,该函数在不使用任何赋值语句的情况下返回列表中的奇数个数。我正在尝试使用谓词奇数?同样。任何帮助/提示将不胜感激。

Ex :(赔率'(1 2 3 4 5)//返回3

此外,列表是整数

5 个答案:

答案 0 :(得分:4)

好吧,如果不能使用赋值语句,您仍然可以使用内置过程。特别是,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

答案 1 :(得分:1)

无论你使用(R6RS?)Scheme还是Racket,这都适用于:

(define (odds lst)
  (length (filter odd? lst)))

(define l '(1 2 3 4 5 6 7 8 9 10))
(odds l)

答案 2 :(得分:0)

尽可能低的水平:

(define odds
  (lambda (lst) 
    (cond ((empty? lst) 0)
          ((not (= 0 (modulo (car lst) 2))) (+ 1 (odds (rest lst))))
          (else (odds (cdr lst))))))

答案 3 :(得分:0)

这是另一个单行

(define (odds L)
 (reduce + 0 (map (lambda (x) (if (odd? x) 1 0)) L)))

答案 4 :(得分: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)))))