Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11634
Последний выпуск: 19.06.2015

Lisp. Размер списка.

271
12 марта 2010 года
Artem_3A
863 / / 11.04.2008
Задание: Постройте функцию, которая проверяет, является ли ее аргумент списком из n элементов.

я реализовал так:

 
Код:
(defun count_eq (x n)
        (if (typep n 'number)
            (and (not (null (nth (- n 1) x))) (null (nth n x)))
            (not t)
        )
)


есть еще рекурсивный вариант:

 
Код:
(defun count_eq (x n)
        (if (not (null (car x)))
            (count_eq (cdr x) (- n 1))
            (= n 0)
        )
)


однако данные функции работают не всегда корректно:

 
Код:
(count_eq '(1 2 ()) 3) -> NIL
(count_eq '(1 2 NIL) 3) -> NIL


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

ЗЫ: функцию list-length не предлагать, бо сразу пропадает спортивный интерес! ;):D:)
304
14 марта 2010 года
Der Meister
874 / / 21.12.2007
CL не знаю, знаю Scheme:
 
Код:
(define (n-list? x count)
  (match x
    [(list head rest ...)
     (n-list? rest (- count 1))]
    ['()
     (= count 0)]
    [_
     #f]))
271
14 марта 2010 года
Artem_3A
863 / / 11.04.2008
спасибо!=)

в итоге я реализовал это дело так.

 
Код:
(defun isnlist (x n)
        (if (numberp n)
            (if (listp x)
                (isnlist (cdr x) (1- n))
                (= n 0)
            )
            t
        )
)
304
14 марта 2010 года
Der Meister
874 / / 21.12.2007
Всё же, посмотрите в стандартной кодобазе камнлиспа механизмы сопоставления с образцом - если Схема, с её исключительно гигиеничными макросами, позволяет делать такие штуки, то в CL сопоставление с образцом присутствует наверняка. Паттерн матчинг универсален, выразителен и им очень удобно пользоваться, особенно при обработке списков.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог