Как я могу получить положительные четные элементы в схеме

#scheme #racket

#схема #ракетка

Вопрос:

Я пытаюсь собрать все ровные и положительные элементы в схему

У меня есть следующий код

 (define (getVals lis)  (cond  ((null? lis) lis)  (((gt; (car lis) 0) (even? (car lis)))  (cons (getVals (cdr lis))))  )  )  

Чтобы проверить мой код, я использую

 getVals '(2 -2 4 6 5))  

Который должен вывести новый список с положительными и четными числами (2 4 6)

Спасибо

Ответ №1:

Самым простым способом было бы использовать встроенные процедуры:

 (define (getVals lis)  (filter (lambda (x) (and (even? x) (positive? x)))  lis))  

Если вы хотите реализовать его с нуля, вам нужно исправить свой код:

  • В нем отсутствует случай, когда текущий элемент не соответствует условиям ( else случай).
  • При вызове отсутствует один параметр cons .
  • Условие отсутствует and .

Вот что я имею в виду:

 (define (getVals lis)  (cond  ((null? lis) lis)  ((and (even? (car lis)) (positive? (car lis)))  (cons (car lis) (getVals (cdr lis))))  (else (getVals (cdr lis)))))  

В любом случае, это работает так, как ожидалось:

 (getVals '(2 -2 4 6 5)) =gt; '(2 4 6)  

Ответ №2:

И просто чтобы добавить к ответу @OscarLopez — если вы посмотрите еще раз, вы увидите, что getVals это просто конкретный случай «фильтра».

 (define (getVals lis)  (cond  ((null? lis) lis)  ((and (even? (car lis)) (positive? (car lis)))  (cons (car lis) (getVals (cdr lis))))  (else (getVals (cdr lis)))))  

Против:

 (define (filter func lst)  (cond  ((null? lis) lst)  ((func (car lst))  (cons (car lst) (filter func (cdr lst))))  (else (filter func (cdr lst)))))  

С filter func as getVales и с func as:

 (lambda (x) (and (even? x) (positive? x)))  

getVals это всего лишь частный случай фильтра:

 (define (getVals lst)  (filter (lambda (x) (and (even? x) (positive? x))) lst))  

Но вам следует следовать руководству по стилю для языков Lisp — не используйте camelCase для имен функций, а предпочитайте типичную для lisp форму get-vals .