Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2 / 2 / 1
Регистрация: 16.01.2013
Сообщений: 165
1

Замена obj1 на obj2 во всех вложениях списка

25.11.2018, 22:21. Показов 1848. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе время суток, пишу функцию замены obj1 на obj2 в списке lst.
Примерно понимаю, что от меня требуется, но вот реализовать не получается.
Вот что я уже реализовал, но встретилась ошибка stack overflow
Lisp
1
2
3
4
5
(defun rep1(lst x y )
    (cond ((null lst) nil)
    ((eql y (car lst)) (cons x (cdr(rep1 lst x y))) )
    (t (cons (car lst) (rep1(x y (car lst))))))
    )
Не получается реализовать рекурсивный вывод от хвоста.
Буду благодарен вашей помощи, только пожалуйста используйте базовые функции lisp.
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2018, 22:21
Ответы с готовыми решениями:

Заменить в списке все вхождения obj1 на obj2
И вот эта задача с применением локальных определений LAMDA и LET : Есть список lst и два...

Замена всех элементов списка верхнего уровня их суммой
Добрый день, есть вот такая задача реализовать функцию, которая в заданном списке заменяет все...

Укажите верные ответы (во вложениях)

найдите ошибку,задание во вложениях
program ss; uses crt var a,x,y,z,E:real; n,s:integer; begin clrscr; write('x=');...

7
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
26.11.2018, 00:27 2
Цитата Сообщение от cb7777 Посмотреть сообщение
stack overflow
Неужели? Скопируйте, пожалуйста, неработающий пример и сообщение об ошибке.

Строка 4: (x y (car lst)) — это вызов функции x (не то, что вам нужно).

Пишите полностью: list, а не lst. В лиспе не сокращают так имена переменных, потому что у переменных и у функций разные пространства имён.
2
Фрилансер
3709 / 2082 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
26.11.2018, 01:28 3
Лучший ответ Сообщение было отмечено helter как решение

Решение

Ну так в 3 строке оно и зациклится, где (cons x (cdr(rep1 lst x y)))
Это же точное повторение исходного вызова, с теми же параметрами..
На самом деле cdr нужно сделать до вызова rep1: (cons x (rep1 (cdr lst) x y))
3
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
26.11.2018, 08:37 4
как вариант:
Lisp
1
2
3
4
5
6
(defun change (w e z &aux (a (car w)))
  (when w (cons (if (eql a e) z a)
                (change (cdr w) e z))))
 
> (change '(a b c a b c) 'c 'd)
(A B D A B D)
Добавлено через 18 минут
с вложенными:
Lisp
1
2
3
4
5
6
7
(defun change (w e z)
  (loop for a in w
        if (listp a) collect (change a e z)
        else collect (if (eql a e) z a)))
 
> (change '((a) b ((c) a) b (c)) 'c 'd)
((A) B ((D) A) B (D))
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
37302 / 20736 / 4272
Регистрация: 12.02.2012
Сообщений: 34,127
Записей в блоге: 14
26.11.2018, 15:31 5
Lisp
1
2
3
4
5
6
7
(defun task (lst x y)
  (mapcar (lambda (a) (if (equal a x) y (if (listp a) (task a x y) a))) lst))
 
==> TASK
 
(task '((a) b ((c) a) b (c)) 'c 'd)
==> ((A) B ((D) A) B (D))
1
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
28.11.2018, 09:18 6
Lisp
1
2
3
4
5
6
7
8
(defun change (w e z &aux (a (car w)) (d (cdr w)))
  (cond ((null w) nil)
        ((listp a) (cons (change a e z) (change d e z)))
        ((eql a e) (cons z (change d e z)))
        ((cons a (change d e z)))))
 
> (change '((a) b ((c) a) b (c)) 'c 'd)
((A) B ((D) A) B (D))
Добавлено через 21 секунду
Lisp
1
2
3
4
5
6
7
8
(defun change (w e z &aux (a (car w)))
  (when w (cons (cond ((listp a) (change a e z))
                      ((eql a e) z)
                      (t a))
                (change (cdr w) e z))))
 
> (change '((a) b ((c) a) b (c)) 'c 'd)
((A) B ((D) A) B (D))
Добавлено через 24 секунды
Lisp
1
2
3
4
5
6
7
8
(defun change (w e z)
  (mapcar #'(lambda (a)
              (if (listp a) (change a e z)
                  (if (eql a e) z a)))
          w))
 
> (change '((a) b ((c) a) b (c)) 'c 'd)
((A) B ((D) A) B (D))
2
2 / 2 / 1
Регистрация: 16.01.2013
Сообщений: 165
10.12.2018, 19:58  [ТС] 7
Спасибо за реализацию, но по тз нельзя пользоваться if и прочими функциями, только базовыми функции типа (atom car, cdr, cond eql)
0
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
11.12.2018, 15:55 8
Lisp
1
2
3
4
5
6
7
8
9
(defun change (w e z)
  (cond ((null w) nil)
        ((listp (car w)) (cons (change (car w) e z)
                               (change (cdr w) e z)))
        ((eql (car w) e) (cons z (change (cdr w) e z)))
        ((cons (car w) (change (cdr w) e z)))))
 
> (change '((a) b ((c) a) b (c)) 'c 'd)
((A) B ((D) A) B (D))
Добавлено через 3 минуты
Lisp
1
2
3
4
5
6
7
8
9
(defun change (w e z)
  (cond ((null w) nil)
        ((atom (car w))
         (cond ((eql (car w) e) (cons z (change (cdr w) e z)))
               ((cons (car w) (change (cdr w) e z)))))
        ((cons (change (car w) e z) (change (cdr w) e z)))))
 
> (change '((a) b ((c) a) b (c)) 'c 'd)
((A) B ((D) A) B (D))
Добавлено через 7 часов 10 минут
Lisp
1
2
3
4
5
6
7
8
9
10
(defun change (w e z)
  (cond ((null w) nil)
        ((cons (cond ((atom (car w))
                      (cond ((eql (car w) e) z)
                            ((car w))))
                     ((change (car w) e z)))
               (change (cdr w) e z)))))
 
> (change '((a) b ((c) a) b (c)) 'c 'd)
((A) B ((D) A) B (D))
2
11.12.2018, 15:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2018, 15:55
Помогаю со студенческими работами здесь

Как это записать в паскале? (5 файлов во вложениях)
Помогите плз

Замена всех запятых крестами, а всех точек - черепами
Здравстуйте. Нужна помощь с программой, которая в вордовском документе заменяет все запятые...

Выполнить обработку списка. Добавить Х до всех негативных элементов списка
Выполнить обработку списка. Данные для начального списка вводятся пользователем. Добавить Х до...

Для одноуровневого списка строк сформировать итоговую строку сцеплением всех элементов списка
Определить функцию, которая для одноуровневого списка строк формирует итоговую строку сцеплением...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru