Поиск:

Ответ в темуСоздание новой темы Создание опроса
> мини рекурсия 
V
    Опции темы
Lion69
Дата 2.10.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



нужно сделать через рекурсию использую базовые ф-ции такую вещь
из (a b c d ) на входе должно получится ((((a)b)c)d) на выходе....
я сделал такое
Код

(defun fak(bla)
    (cond((null  (cdr bla))bla )(t
        (cons (fak(cdr bla)) (cons (car bla)nil))
        )
    )
)


но оно  выдает список наоборот...
> (fak '(5 2 4 86 1 2 ))  
((((((2) 1) 86) 4) 2) 5)         
мне не нужна прям готовая ф-я.. мне нужна подсказка.....   
как делать и самое главно с чего начать...           

Это сообщение отредактировал(а) Lion69 - 2.10.2009, 17:25
PM MAIL   Вверх
Ryukzak
Дата 2.10.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Рекурсия позволяет собирать структуры от внутренних к внешним. Так что придётся либо развернуть список, либо реализовать его хвостовой рекурсией.
PM MAIL   Вверх
Lion69
Дата 2.10.2009, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



как развернуть список я не знаю... это всмысле реверс или как? в таком случае как его сделать в рекурсии...?
Цитата

реализовать его хвостовой рекурсией. 

Код

(cons (fak(cdr bla)) 

я думал это и есть хвостовая рекурчия.......
ЗЫ.. я меньше месяча лисп учу... так что извеняйте за может быть глупые вопросы

Добавлено через 5 минут и 3 секунды
я кстате над этой прогой уже второй день бьюсь...  хотел бы уже начать что то еще делать ... но не могу..... дошло до  того что аж сюда на форум обратился.....  не могу понять что тут делать....
PM MAIL   Вверх
Void
Дата 2.10.2009, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Стандартный приём функционального программирования — протаскивать через цепочку рекурсивных вызовов значение-аккумулятор.
Код

(defun foo (acc s)
    (if (null s)
        acc
        (foo (list acc (car s)) (cdr s))))

Цитата
> (foo '(a) '(b c d))
((((A) B) C) D)

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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Lion69
Дата 2.10.2009, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Void,  извини но не понятно.....как сделать это для одного списка? типа (a b c d)???
и еще мне я не знаю что такое IF.... это типа такая запись терминальной ветви.....?(я ведь говорил что новичок...) если не сложно  то помоги... а то что то по истечиние двух дней игр с этой задачей что то вообще соображать перестал...

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


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(Lion69 @  2.10.2009,  22:51 Найти цитируемый пост)
как сделать это для одного списка?

Сделать из головы (car) список из одного элемента и передать как первый параметр (аккумулятор), хвост передать как второй.
Код
(defun bar (s)
    (foo (list (car s)) (cdr s)))

Для порядка можно функции сделать вложенными:
Код
(defun quux (lst)
    (labels (
        (inner (acc s)
            (if (null s)
                acc
                (inner (list acc (car s)) (cdr s)))))
        (inner (list (car lst)) (cdr lst))))

Но на данном этапе, наверное, не стоит заморачиваться.
Цитата(Lion69 @  2.10.2009,  22:51 Найти цитируемый пост)
не знаю что такое IF

Условный оператор, однако. (if условие если-истина если-ложь).



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Lion69
Дата 3.10.2009, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Void, спасибо... правда я плохо понимаю как оно дейтвует... все таки я привык к терминальной ветви а за ней должна идти сама рекурсия...  ну ладно это такое....  еще раз спасибо....
да... нащет ифа... я просто не понил что этот условний оператор делает... имено в этом примере... а не вообще... не нужно меня причислять к слабоумным...)))
PM MAIL   Вверх
Void
Дата 3.10.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(Lion69 @  3.10.2009,  02:14 Найти цитируемый пост)
все таки я привык к терминальной ветви а за ней должна идти сама рекурсия

Ну и в чём проблема?
Код
(inner (acc s)
    (if (null s)
        acc  ;;; терминальная ветвь — просто возвращаем значение acc
        (inner (list acc (car s)) (cdr s))))) ;;; рекурсивный вызов

Цитата(Lion69 @  3.10.2009,  02:14 Найти цитируемый пост)
да... нащет ифа... я просто не понил что этот условний оператор делает... имено в этом примере... а не вообще... не нужно меня причислять к слабоумным...))) 

Ну извиняюсь, вопрос
Цитата(Lion69 @  2.10.2009,  22:51 Найти цитируемый пост)
я не знаю что такое IF

неоднозначных толкований вроде не допускает, так что я ответил на него smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Lion69
Дата 3.10.2009, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



smile
PM MAIL   Вверх
_sg
Дата 25.4.2014, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



как вариант:
Код

(defun annex (w)
  (reduce #'list (cons (list (car w)) (cdr w))))
 
> (annex '(a b c d e))
(((((A) B) C) D) E)

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

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

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


 




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


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

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