Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
2 / 2 / 2
Регистрация: 30.04.2012
Сообщений: 22
1

Обработка многоуровнего списка

20.05.2012, 11:14. Показов 1067. Ответов 5
Метки нет (Все метки)

Добрый день.

Помогите, пожалуйста, разобраться со следующей проблемой: необходимо переделать код, что бы была возможность обработать многоуровневый список.

Задание: Определите функцию (f s n), которая из списка чисел s создает новый список,
прибавляя к каждому атому число n. Исходный список не предполагается одноуровневым.

Lisp
1
2
3
4
5
6
(defun f (s n)
   (let ((l (length s))
         (res nil))
        (dotimes (i l res)
          (setq res (append res (list (+ (car s) n))))
          (setq s (cdr s)))))
ЗЫ код не мой, лишь переделал его под свои нужды.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.05.2012, 11:14
Ответы с готовыми решениями:

Обработка многоуровнего списка
Не могли бы вы помочь, есть ли в лиспе функция, которая из многоуровнего списка делает...

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

Определить функцию, которая удаляет все положительные числа из многоуровнего списка
Помогите пожалуйста решить задачу на экзамене! Необходимо определить функцию которая из...

Как сделать ввод в Excel из многоуровнего списка через форму ввода?
На листе excel есть справочная таблица из 3 столбцов. В первом перечислены классы, во втором -...

5
Модератор
Эксперт Python
28783 / 15610 / 3100
Регистрация: 12.02.2012
Сообщений: 25,612
Записей в блоге: 4
20.05.2012, 11:21 2
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun f (s n)
   (let ((l (length s))
         (res nil))
        (dotimes (i l res)
          (setq res (append res (if (atom (car s)) (list (+ n (car s))) (list (f (car s) n)))) )
          (setq s (cdr s)))))
 
==> f
 
(f '(1 (2 3) 4) 5)
 
==> (6 (7 8) 9)
1
4529 / 4235 / 359
Регистрация: 12.05.2012
Сообщений: 2,978
20.05.2012, 13:50 3
Lisp
1
2
3
4
5
6
7
(defun add (w n &aux (a (car w)))
  (cond ((null w) nil)
        ((consp a) (cons (add a n) (add (cdr w) n)))
        ((cons (+ a n) (add (cdr w) n)))))
 
> (add '(1 (2) (3 (4)) 5) 1)
(2 (3) (4 (5)) 6)
1
2 / 2 / 2
Регистрация: 30.04.2012
Сообщений: 22
21.05.2012, 10:54  [ТС] 4
Цитата Сообщение от Catstail Посмотреть сообщение
Lisp
1
2
3
...
(setq res (append res (if (atom (car s)) (list (+ n (car s))) (list (f (car s) n)))) )
...
Уважаемый, Catstail, не будет ли Вам сложно пояснить как выполняется "if ... then .. else" ?
Я понимаю так: если первый элемент списка атом, тогда печатаем этот же элемент с прибавлением n, иначе - печатаем (здесь не понятная рекурсия, ведь если в процедуру передадим значения списка лишь первый элемент, от того что имеется сейчас, то на этом и закончится программа, но сие работает, не понимаю...)

ЗЫ делал трассировку, все равно не понял ;(
0
Модератор
Эксперт Python
28783 / 15610 / 3100
Регистрация: 12.02.2012
Сообщений: 25,612
Записей в блоге: 4
21.05.2012, 14:22 5
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun f (s n)
   (let ((l (length s))
         (res nil))
        (dotimes (i l res)
 
          (setq res (append res ;; присоединяем к переменной res
 
          (if (atom (car s))      ;; если голова списка есть атом (число)
 
                (list (+ n (car s))) ;; то прибавляем n присоединяем к res
 
               (list (f (car s) n)))) ;; если голова списка НЕ атом (т.е. список) - то рекурсивно
                                          ;; применяем нашу же функцию
          )
 
          (setq s (cdr s)))))
0
2 / 2 / 2
Регистрация: 30.04.2012
Сообщений: 22
22.05.2012, 11:46  [ТС] 6
Catstail, спасибо, теперь понял.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2012, 11:46

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Обработка списка: после каждого нуля добавить предшествующую часть списка
Дан список чисел, нужно после каждого нуля добавить предшествующую часть списка. Написал что-то, но...

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

Необходимо разработать программу, в которой выполняется ввод списка записей определенного типа, а затем - обработка списка. Сначала в программе должен
Вывести на экран все записи товаров, определенного ценового диапазона. Ценовой диапазон указывается...

Реализация многоуровнего меню
Уважаемые форумчане, помогите пожалуйста мне понять как формируется меню в битриксе. цель...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.