Функция в схеме, которая проверяет, является ли длина списка четной - PullRequest
0 голосов
/ 15 декабря 2009

Привет! Я отредактировал код функции в схеме, которая проверяет, является ли длина списка четной.

(define even-length?
  (lambda (l)
  (cond 
   ((null? l)#f)
   ((equal? (remainder (length(l)) 2) 0) #t)
   (else #f))))

Это правильно?

Ответы [ 3 ]

2 голосов
/ 15 декабря 2009

Код явно неверный - ваш %2 предполагает инфиксную нотацию, где Схема использует префиксную нотацию. Синтаксис вашего if также неверен - для if, else неявно (т.е. у вас есть if condition true-expression false-expression. В этом случае вы пытаетесь вернуть #t с одной ноги и # f с другой ноги - это совершенно не нужно. Вы можете просто вернуть выражение, которое вы тестировали в if.

Редактировать: еще одна деталь - вы должны действительно переименовать это в что-то вроде even-length?. Даже если я предположу, что это предикат, имя типа even будет означать для меня, что (even 3) должен возвращать #f, а (even 4) должен возвращать #t - но в этом случае ни то, ни другое не работает.

Edit2: Так как mquander уже дал вам одну версию кода, я думаю, что еще одна не повредит. Я бы написал так:

(define (even-length? L) (even? (length L)))

Мне не очень нравится использовать строчные буквы 'l' (но сам по себе), поэтому я набрал их заглавными буквами. Поскольку even? встроен, я использовал его вместо того, чтобы находить остаток.

Запуск этого дает:

> (even-length? `(1 2 3))
#f
> (even-length? `(1 2 3 4))
#t
> 

Это отличается от того, что вы имели в одном отношении: длина пустого списка равна 0, что считается четным числом, поэтому:

(четная длина? `())

дает # т.

2 голосов
/ 15 декабря 2009

Вы, кажется, перепутали синтаксис для if и cond. Я предлагаю обратиться к языковой справке . if имеет только два предложения, и вы не пишете else для предложения else. (Совет: вам вообще не нужно if для этой функции.)

Кроме того, подумайте, имеет ли смысл возвращать null, если список равен null; возможно, вы хотите вернуть #t или #f.

О да, и переписайте ваш вызов length, чтобы он был правильным вызовом функции Scheme в стиле префикса.

1 голос
/ 17 декабря 2009
(define even-length? (lambda (l)
    (even? (length l))))

Использование:

(even-length? '(1 2 3 4))
#t
(even-length? '(1 2 3 ))
#f

Как отмечали другие, действительно есть предикат для проверки четности числа, так почему бы не использовать его?

РЕДАКТИРОВАТЬ: Я только что видел, как Джерри Коффин написал ту же функцию с тем же примером ... Извините за повторение: -)

...