Ракетка: произведение четного числа - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь произвести произведение четных чисел в заданном списке. Я пытаюсь повторить следующий пример:

Пример: (четные числа продуктов '(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...:

Я понимаю, что мне не хватает второго аргумента, но я не знаю, каким должен быть второй аргумент.

1 Ответ

0 голосов
/ 07 ноября 2018

Почему вы используете сопоставление с образцом? это было бы легче понять без него, и прежде всего вам нужно правильно понять рекурсию и логику:

(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
...