Ожидает 2 аргумента, но нашел только 1 - PullRequest
1 голос
/ 10 октября 2019

Я задаю практический вопрос, в котором предлагается определить функцию, которая должна генерировать все элементы в списке, loi, которые можно разделить на 3 или натуральное число, mult, но не на оба.

Ниже мой код:

(define (keep-multiples-of-three-or loi mult)
  (cond
    [(empty? loi) empty]
    [else (cond [(empty? loi) empty]
                [(and (not (equal? 3 mult)) 
                      (or (equal? (remainder (first loi) 3) 0)
                          (equal? (remainder (first loi) mult) 0)))   
                 (first loi)]           
                [else (keep-multiples-of-three-or (rest-loi) 
                                                  mult)]))]))

для (keep-multiples-of-three-or (cons 9 (cons 3 empty)) 3) сообщение об ошибке гласит: cons expects 2 arguments but found only 1.

Я не знаю, что здесь не так. Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 10 октября 2019

У вас есть пара ошибок:

  • Нет необходимости вкладывать выражение cond
  • Случай [(empty? loi) empty] повторяется два раза
  • Это не (rest-loi), это (rest loi)
  • Во втором случае вам нужно cons результат и снова вызвать рекурсию
  • Условие (not (equal? 3 mult)) делает ваш пример возвращаемымпустой список, подумайте об этом: вы говорите, что mult это 3, но затем вы проверяете его mult это не 3

Этодолжны решить проблемы:

(define (keep-multiples-of-three-or loi mult)
  (cond [(empty? loi) empty]
        [(or (equal? (remainder (first loi) 3) 0)
             (equal? (remainder (first loi) mult) 0))
         (cons (first loi)
               (keep-multiples-of-three-or (rest loi) mult))]
        [else (keep-multiples-of-three-or (rest loi) mult)]))

Например:

(keep-multiples-of-three-or (list 9 3) 3)
=> '(9 3)
(keep-multiples-of-three-or (list 1 3 5 9) 5)
=> '(3 5 9)
...