球拍:偶数乘积

时间:2018-11-07 06:30:08

标签: racket

我正在尝试在给定列表中产生偶数乘积。 我正在尝试复制以下示例:

示例: (乘积偶数'(2 1 6 3 5)) ==> 12

这是我的乘积偶数定义版本:

(define (product-even-numbers lst)
  (define/match (recurse lst accumulator)
    ;; A _ pattern matches any syntax object
    [(_ _) (* car (recurse cdr))])
  (recurse lst 1))

我遇到以下错误:

(product-even-numbers '(2 1 6 3 5))
. . recurse: arity mismatch;
 the expected number of arguments does not match the given number
  expected: 2
  given: 1
  arguments...:

我知道我缺少第二个参数,但是我不知道第二个参数应该是什么。

2 个答案:

答案 0 :(得分:1)

为什么要使用模式匹配?如果没有它,这将更容易理解,首先,您需要获得递归和正确的逻辑:

(define (product-even-numbers lst)
  (define (recurse lst acc)
    (cond ((null? lst) acc)
          ((even? (car lst)) (recurse (cdr lst) (* (car lst) acc)))
          (else (recurse (cdr lst) acc))))
  (recurse lst 1))

在这种情况下,很明显第二个参数是我们到目前为止的累积产品。我们需要考虑三种情况:空列表,偶数元素,奇数元素。例如:

(product-even-numbers '(2 1 6 3 5))
=> 12

答案 1 :(得分:0)

(define (product-even-numbers lst)
  (local [(define tmp (foldr * 1 (filter even? lst)))]
    (if (= 1 tmp) 'nothing tmp)))

如果输出1表示没有任何偶数。

(define (product-even-numbers2 lst)
  (foldr * 1 (filter even? lst))) ; or use (apply * (filter even? lst))