![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
мисс_граффити |
![]()
Сообщение
#1
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
Доброго времени суток.
Задание такое: дан список (целых чисел. сколько элементов - не известно) Надо разделить его на 2 списка (пополам. куда отнести средний элемент, если количество нечетное - не принципиально). Считать (и определять другими способами) кол-во элементов запрещено. Поскольку речь идет про функцию, допустим, что она будет возвращать одну из половин (пусть первую - для определенности). Как этого можно добиться? У меня идея такая (весьма неоптимальная). 1) Терминальные случаи. Если список пуст или состоит из 1 эл-та - все просто и понятно. 2) Иначе результатом будет первый элемент, соединенный с поделенным пополам остатком списка после откидывания последнего элемента. Ну на примере: на входе имеем '(1 2 3 4 5) выделяем 1 отбрасываем 5 теперь так же ищем половину от нового списка - (2 3 4) выделяем 2 отбрасываем 4 получаем терминальный случай. на выходе (1 2 3) для выделения первого элемента есть CAR, для получения остатка - CDR. Для отбрасывания последнего придется писать что-то свое. и ничего умнее, чем рекурсивно перебирать элементы, пока остаток не будет равен NIL, я придумать не могу ![]() Работать такой алгоритм, возможно, и способен - но уж больно много лишних операций. Буду благодарна за идеи по оптимизации. -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
![]() ![]() |
мисс_граффити |
![]()
Сообщение
#2
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
варианты замечательные, но вот как их применить к лиспу... буду думать )))
спасибо. -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
Fanat |
![]()
Сообщение
#3
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Можно вот так
(Defun Func(L) (Setq L1 '() L2 '()) (Loop ((eq L Nil) (Reverse L1)) (Push (Car L) L1) (Push (Car (Reverse L) L2)) (Setq L (Cdr L)) (Setq L (Reverse (Cdr (Reverse L)))) ) ) Вот лисп я изучал... ![]() |
hardcase |
![]()
Сообщение
#4
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: ![]() ![]() ![]() |
Можно вот так (Defun Func(L) (Setq L1 '() L2 '()) (Loop ((eq L Nil) (Reverse L1)) (Push (Car L) L1) (Push (Car (Reverse L) L2)) (Setq L (Cdr L)) (Setq L (Reverse (Cdr (Reverse L)))) ) ) Вот лисп я изучал... ![]() Это и есть вариант мисс_граффити, предложенный в первом сообщении темы. -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 3:19 |