![]() |
Модераторы: Poseidon |
![]() ![]() ![]() |
|
dorfe |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 30.9.2007 Репутация: нет Всего: нет |
Я в Лиспе пока ньюб :-(, но стоит такая задача: преобразовать произвольный многоуровневый список вида (a b ((c d) e f) g (h)) в (a b ((c d 2) e f 3) g (h 1) 5), т.е. добавить к каждому подсписку кол-во его элементов, которое должно вычисляться рекурсивно _этой же_ функцией.
Проблема в том, что должна быть _одна_ рекурсивная функция, которая все это делает... Ай нид ю хелп ![]() ![]() ![]() |
|||
|
||||
adejneka |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 8.7.2005 Где: Москва, Россия Репутация: 2 Всего: 11 |
Вместо функции (recursive-add-lengths list), которая делает то, что Вы описали, определите функцию (recursive-add-lengths-from list shift), которая добавляет ко всем внутренним спискам, как и прежняя, их длины, а в конец списка верхнего уровня добавляет длину, увеличенную на shift (старая функция является частным случаем новой с SHIFT=0).
|
|||
|
||||
dorfe |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 30.9.2007 Репутация: нет Всего: нет |
Гм, спасибо конечно, но не совсем понял: это будет одна функция или две? или одна, но дважды перегруженая? Если можно - кодом, плз.
|
|||
|
||||
adejneka |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 8.7.2005 Где: Москва, Россия Репутация: 2 Всего: 11 |
Одна.
Что это значит? Я правильно понимаю, что более простые задачи - сосчитать длину списка, используя накапливающий параметр (т.е. в константной памяти), добавить в конец списка его длину (не заходя в глубь элементов), решить Вашу задачу, используя несколько функций, - Вы решать умеете? Кстати, не нужно "ю" заменить на "йо"? |
||||
|
|||||
mrco |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 4.10.2006 Репутация: нет Всего: 1 |
Это сообщение отредактировал(а) mrco - 1.10.2007, 11:57 |
|||
|
||||
dorfe |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 30.9.2007 Репутация: нет Всего: нет |
2adejneka: да, задачу нужно решить одной рекурсивной функцией.
Тут не понял, смотря где ![]() mrco, спасибо, вроде то что нужно, т.е. без цикла тут все равно никуда... |
|||
|
||||
adejneka |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 8.7.2005 Где: Москва, Россия Репутация: 2 Всего: 11 |
||||
|
||||
VH_ |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 182 Регистрация: 31.10.2006 Репутация: 1 Всего: 11 |
|
||||
|
|||||
mrco |
|
||||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 4.10.2006 Репутация: нет Всего: 1 |
Достаточно и двухуровневой рекурсии:
|
||||
|
|||||
adejneka |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 8.7.2005 Где: Москва, Россия Репутация: 2 Всего: 11 |
Здесь есть неприятный момент: делается три прохода по списку верхнего уровня: считается длина списка, собирается список рекурсивных применений Ф, затем он копируется и в конец приписывается длина. Можно собирать список применений в обратном порядке, а затем его инвертировать, либо воспользоваться нестандартным макросом COLLECT, имеющимся, например, в CMUCL и SBCL:
|
||||
|
|||||
dorfe |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 30.9.2007 Репутация: нет Всего: нет |
mrco, такой вариант вроде не подходит - выдает (a b ((c d 2) e f 3) g (h 1) 10 ) например
![]() Спасибо за все остальные варианты! ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Центр помощи" | |
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |