![]() |
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, я придумать не могу ![]() Работать такой алгоритм, возможно, и способен - но уж больно много лишних операций. Буду благодарна за идеи по оптимизации. -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
klem4 |
![]()
Сообщение
#2
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
с лиспом к сожалению не знаком, но думаю там такое вполне можно сделать:
uses crt; тока список почистить забыл ![]() Сообщение отредактировано: klem4 - 5.09.2007 18:51 -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
мисс_граффити |
![]()
Сообщение
#3
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
Там, к сожалению, все совсем по-другому
![]() ![]() Цитируя моего препода: "На делфи вы пишете, КАК искать результат, а на ЛИСПе - ЧТО хотите получить". И еще проблема - мы список не заполняем, а считаем уже данным. То есть считать добавленные элементы по ходу не получится. ![]() Спасибо за готовность помочь! ![]() А вообще, если интересно, это всё ради того, чтобы пройти матрицу (=список списков) по определенному маршруту.... На делфи это бы решилось кучей циклов, а здесь - еще большей кучей функций ))) -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
klem4 |
![]()
Сообщение
#4
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
ну а если так (алгоритм остается тот-же):
-------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
hardcase |
![]()
Сообщение
#5
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: ![]() ![]() ![]() |
А вот мой вариант (сорри, на лиспе тока читать умею).
Производим 2 прохода по списку: 1 проход. Выбираем из входного списка А только нечетные элементы в список Н. 2 проход. Выполняем проход по входному списку А одовременно с проходом по списку Н, полученному при первом проходе, и выбираем каждый элемент из А. Проход останавливается когда достигаем конца Н. З.Ы. 2 проход можно впихнуть в возврат из рекурсии в первом проходе. тогда мы получим вторую половину списка. Сообщение отредактировано: hardcase - 5.09.2007 19:51 -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
мисс_граффити |
![]()
Сообщение
#6
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
варианты замечательные, но вот как их применить к лиспу... буду думать )))
спасибо. -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
Fanat |
![]()
Сообщение
#7
|
![]() 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)))) ) ) Вот лисп я изучал... ![]() |
мисс_граффити |
![]()
Сообщение
#8
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
спасибо...
...ушла читать про незнакомые слова ))) -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
hardcase |
![]()
Сообщение
#9
|
![]() 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)))) ) ) Вот лисп я изучал... ![]() Это и есть вариант мисс_граффити, предложенный в первом сообщении темы. -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
![]() ![]() |
![]() |
Текстовая версия | 19.06.2025 22:05 |