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

задание5

18.12.2013, 21:29. Показов 1009. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Используя рекурсию в Common Lisp сделать следующие преобразования:
Получая в качестве исходных данных 3 списка вида:
1. (a b c d (e f) (g h) i j)
2. (X Y Z V W T S Q)
3. (1 0 0 1 1 0 1 1)
создать список вида:
(a Y Z d (e f) T i j),
то есть, заменить елементы первого списка елементами второго списка, в тех позициях, в которых в третем списке стоят нули.
0
Лучшие ответы (1)
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
18.12.2013, 21:55 2
Лучший ответ Сообщение было отмечено как решение

Решение

Гораздо проще сделать это функционалом mapcar:

Lisp
1
2
3
4
5
6
7
8
(defun task (lst1 lst2 scala)
  (mapcar #'(lambda (x y z) (if (zerop z) y x)) lst1 lst2 scala))
 
==> task
 
(task '(a b c d (e f) (g h) i j) '(X Y Z V W T S Q) '(1 0 0 1 1 0 1 1))
 
==> (a y z d (e f) T i j)
Добавлено через 2 минуты
Но можно и рекурсивно:

Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun task (lst1 lst2 scala)
  (cond ((or (null lst1) (null lst2) (null scala)) nil)
        ((zerop (car scala)) (cons (car lst2) (task (cdr lst1) (cdr lst2) (cdr scala))))
        (t (cons (car lst1) (task (cdr lst1) (cdr lst2) (cdr scala))))))
  
 
==> task
 
(task '(a b c d (e f) (g h) i j) '(X Y Z V W T S Q) '(1 0 0 1 1 0 1 1))
 
==> (a y z d (e f) T i j)
3
1 / 1 / 0
Регистрация: 18.12.2013
Сообщений: 17
18.12.2013, 21:59  [ТС] 3
Цитата Сообщение от Catstail Посмотреть сообщение
Гораздо проще сделать это функционалом mapcar:

Lisp
1
2
3
4
5
6
7
8
(defun task (lst1 lst2 scala)
  (mapcar #'(lambda (x y z) (if (zerop z) y x)) lst1 lst2 scala))
 
==> task
 
(task '(a b c d (e f) (g h) i j) '(X Y Z V W T S Q) '(1 0 0 1 1 0 1 1))
 
==> (a y z d (e f) T i j)
Добавлено через 2 минуты
Но можно и рекурсивно:

Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun task (lst1 lst2 scala)
  (cond ((or (null lst1) (null lst2) (null scala)) nil)
        ((zerop (car scala)) (cons (car lst2) (task (cdr lst1) (cdr lst2) (cdr scala))))
        (t (cons (car lst1) (task (cdr lst1) (cdr lst2) (cdr scala))))))
  
 
==> task
 
(task '(a b c d (e f) (g h) i j) '(X Y Z V W T S Q) '(1 0 0 1 1 0 1 1))
 
==> (a y z d (e f) T i j)
спасибо
0
18.12.2013, 21:59
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru