Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сортировать символьные списки? Пожалуйста, помогите разобраться. 
V
    Опции темы
AlexSas
Дата 14.11.2009, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.11.2009

Репутация: нет
Всего: нет



Здравствуйте!!! Преподаватель дал задание написать степень-множество и отсортировать его. Саму степень я написал, а вот с сортировкой возникли сложности - препод сказал, что в списке могут быть и СИМВОЛЫ!!!!! А как организовать сортировку символов???
Код

    (defun binary (bin &optional temp_1 res_b)
    (loop
      (cond
        ((= bin 0) (return (setq res_b (list 0)))))
      (cond
        ((= bin 1) (return (reverse (append res_b (list 1))))))
      (setq temp_1 bin)
      (cond
        ((null(oddp temp_1)) (setq res_b (append res_b (list 0))) (setq bin (truncate bin 2))))
      (cond
        ((oddp temp_1) (setq res_b (append res_b (list 1))) (setq bin (truncate bin 2)))) ))
 
(defun stepen (str &optional s1 s2 s3 res_temp res_s)
    (setq s1 1)
    (loop
      (cond
        ((= s1 (expt 2 (length str))) (return (cons nil res_s))))
      (setq s2 (reverse (binary s1)))
      (setq s3 0)
      (setq res_temp nil)
      (loop
        (cond
          ((= s3 (length s2)) (return (setq res_s (append res_s (list res_temp))))))
        (cond
          ((= (nth s3 s2) 1) (setq res_temp (append res_temp (list (nth s3 str))))))
        (cond
          ((< s3 (length s2)) (setq s3 (+ s3 1)))) )
      (cond
        ((< s1 (expt 2 (length str))) (setq s1 (+ s1 1)))) ))
// (stepen '(1 2 3)) --> (nil (1) (2) (3) (1 2) (2 3) (1 3) (1 2 3))

В общем, результат этой проги (степень-множество) мне надо отсортировать. Причем здесь могут быть символы, числа и их помесь. Есть ли возможность сравнивать списки символов (например, (a b c) и (a c d)) как числовые списки? Помогите пожалуйста кто чем может!!!!!!!!!!! Очень надо!!!!!!!!!!!  smile   smile 

Это сообщение отредактировал(а) Void - 15.11.2009, 12:52
PM MAIL   Вверх
VH_
Дата 15.11.2009, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 31.10.2006

Репутация: 10
Всего: 11



Хювёнен-Сеппянен "Мир Лиспа" т.1 стр.273-274:
"Далее <...> мы определим очень полезный с точки зрения абстрактного построения функционал ИНДЕКС, который осуществляет над выражениями X = (X1 X2 ... XN) и Y действия по следующей схеме:
(индекс x y fn) <=> (fn 'X1 (fn 'X2 ... (fn 'XN y) ...))
Получим для функционала ИНДЕКС простое рекурсивное определение:
Код
(defun index (x y fn)
 (cond
  ((null x) y)
  (T (funcall fn (car x) (index (cdr x) y fn)))))

<...>
Функционал ИНДЕКС очень полезен. С его помощью можно, например, вычислить и множество всех подмножеств множества (power set) (Ваш препод не это имел в виду? - VH.):
Код
(defun powerset (x)
 (cond
  ((null x) '(nil))
  (T
   (index
    (powerset (cdr x))
    nil
    (function (lambda (u v) (cons (cons (car x) u) (cons u v))))))))


Это сообщение отредактировал(а) VH_ - 16.11.2009, 13:11
PM MAIL   Вверх
AlexSas
Дата 15.11.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.11.2009

Репутация: нет
Всего: нет



[quote]
Функционал ИНДЕКС очень полезен. С его помощью можно, например, вычислить и множество всех подмножеств множества (power set) (Ваш препод не это имел в виду? - VH.):
[/quot]

Да-да именно это  smile . Спасибо за короткую программу! Сам я смог только до итерации додуматься... Но программа выдает подмножества в неупорядоченном виде, Вы не могли бы подсказать, как можно их отсортировать?  smile  Заранее огромное спасибо!!!

Это сообщение отредактировал(а) AlexSas - 15.11.2009, 11:38
PM MAIL   Вверх
VH_
Дата 16.11.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 31.10.2006

Репутация: 10
Всего: 11



Как раз «программа выдает подмножества» в весьма упорядоченном виде, а именно:
(powerset '(1 2 3 4)) возвращает (черточки находятся на местах исключенных элементов, числа в комментариях получаются, если черточки заменить на 1, а не-черточки - на 0 и перевести двоичное число <в формате "младшие биты слева"> в десятеричный вид)
Код

((1 2 3 4) ; 0
 (- 2 3 4) ; 1
 (1 - 3 4) ; 2
 (- - 3 4) ; 3
 (1 2 - 4) ; 4
 (- 2 - 4) ; 5
 (1 - - 4) ; 6
 (- - - 4) ; 7
 (1 2 3 -) ; 8
 (- 2 3 -) ; 9
 (1 - 3 -) ; 10
 (- - 3 -) ; 11
 (1 2 - -) ; 12
 (- 2 - -) ; 13
 (1 - - -) ; 14
 (- - - -)) ; 15

А Вам (то есть, канечна, преподу) какое упорядочивание надо? Давайте сформулируем <сначала> правила.

Это сообщение отредактировал(а) VH_ - 16.11.2009, 16:34
PM MAIL   Вверх
AlexSas
Дата 16.11.2009, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.11.2009

Репутация: нет
Всего: нет



Понимаете, когда я показал преподавателю результат итерационной версии

(NIL (1) (2) (1 2) (3) (1 3) (2 3) (1 2 3) (4) (1 4) (2 4) (1 2 4) (3 4) (1 3 4) (2 3 4) (1 2 3 4)),

мне сказали, что должно получаться множество вида

(NIL (1) (2) (3) (4) (1 2) (1 3) (1 4) (2 3) (2 4) (3 4) (1 2 3) (1 2 4) (1 3 4) (2 3 4) (1 2 3 4))

или, как в Вашей программе, наоборот (от (1 2 3 4) до (NIL)). Кроме того, он сказал мне, что вместо чисел могут быть и символы. Я даже числовые списки не могу построить таким образом, не говоря уж о символьных. Я пробовал сравнивать два списка вида (1 3) (1 4) поэлементно (что у меня не очень получилось), но вот как сравнивать, например, (a b) и (a c) - я вообще не знаю.

Это сообщение отредактировал(а) AlexSas - 16.11.2009, 22:03
PM MAIL   Вверх
VH_
Дата 17.11.2009, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 31.10.2006

Репутация: 10
Всего: 11



Понятно, препод хочет поалфавитуидлинеотсортированные.
Попробуем.
Рассмотрите функцию (symbol-name).
PM MAIL   Вверх
AlexSas
Дата 18.11.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.11.2009

Репутация: нет
Всего: нет



Правильно ли я понял идею: symbol-name возвращает имя переменной как строку. То есть, мы сможем использовать операции string=, string< и string>, и таким образом, сравнивая списки поэлементно, определить, какой из них больше/меньше? Подумаю над этим и выложу результат. Спасибо огромное!!!
PM MAIL   Вверх
VH_
Дата 19.11.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 31.10.2006

Репутация: 10
Всего: 11



Код
(defun F (L &optional acc)
 (if L
  (F (cdr L) (INSERT (cons (length (car L)) (car L)) acc))
  (mapcar 'cdr acc)))

Код
(defun INSERT (E L)
 (cond
  ((null L) (cons E L))
  ((< (car E) (caar L)) (cons E L))
  ((= (car E) (caar L))
   (if (.LT. (cdr E) (cdar L))
    (cons E L)
    (cons (car L) (INSERT E (cdr L)))))
  (T (cons (car L) (INSERT E (cdr L))))))

Код
(defun .LT. (new old)
 (if (null new) T
  ((lambda (e_new e_old)
    (cond
     ((and (symbolp e_new) (symbolp e_old))
      (cond
       ((string< (symbol-name e_new) (symbol-name e_old)) T)
       ((string> (symbol-name e_new) (symbol-name e_old)) nil)
       (T (.LT. (cdr new) (cdr old)))))
     ((and (numberp e_new) (numberp e_old))
      (cond
       ((< e_new e_old) T)
       ((> e_new e_old) nil)
       (T (.LT. (cdr new) (cdr old)))))
     ((and (numberp e_new) (symbolp e_old)))))
   (car new)
   (car old))))

Функция (.LT.) предполагает, что числа «раньше» символов.
Может быть, упорядочивание по длине списка имеет смысл, а вот упорядочивание списков одинаковой длины по содержимому - IMHO не имеет, так как списки <в соответствии с заданием> представляют собой множества, в которых порядок элементов в списке не важен и множество (1 2 B) - это то же самое, что (В 2 1), а это приводит к ситуации, когда результат может выглядеть (... (3 1 A) ... (B 2 1) ...) либо (... (1 2 B) ... (1 A 3) ...), то есть те же множества располагаются во взаимно обратных последовательностях, и это зависит от <случайной> исходной последовательности.
Так что можно сделать функцию (INSERT) без обращения к функции (.LT.) и излишнего тасования колоды:
Код
(defun INSERT (E L)
 (cond
  ((null L) (cons E L))
  ((<= (car E) (caar L)) (cons E L))
  (T (cons (car L) (INSERT E (cdr L))))))


Это сообщение отредактировал(а) VH_ - 19.11.2009, 11:17
PM MAIL   Вверх
AlexSas
Дата 27.11.2009, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.11.2009

Репутация: нет
Всего: нет



Преподу Ваша сортировка очень понравилась, так что я сдал программу!!!  smile 

Спасибо Вам огромное, VH, без Вашей помощи я бы не справился!!!!  smile 

Это сообщение отредактировал(а) AlexSas - 27.11.2009, 21:42
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LISP | Следующая тема »


 




[ Время генерации скрипта: 0.0457 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.