> 1 <

Автор Сообщение

Dremuk

Members


Статус

7 сообщений

Где: Belarus Лунинец
Род занятий:
Возраст: 36

#2109   2010-05-22 02:47 GMT+3 часа(ов)      
Требуется определить функцию (f s n), которая из списка чисел s создает новый список, прибавляя к каждому атому число n. Исходный список НЕ предполагается одноуровневым.
Тут нужно использовать функционалы и, мне кажется mapcar. Но что-то я не могу понять какк это сделать.

Хотя бы наведите на мысль

_lee

Members


Статус

69 сообщений

Где: Russia
Род занятий:
Возраст:

#2110   2010-05-22 05:34 GMT+3 часа(ов)      
 
(defun map-tree (f s)
(cond ((null s) nil)
((atom s) (funcall f s))
(t (cons (map-tree f (car s))
(map-tree f (cdr s))))))
 
 
(defun f (s n)
(map-tree (lambda (x) (+ x n))
s))
 

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#2111   2010-05-22 09:54 GMT+3 часа(ов)      
(defun F (L N)
(cond
((null L) nil)
((atom (car L)) (cons (+ (car L) N) (F (cdr L) N)))
(T (cons (F (car L) N) (F (cdr L) N)))))

(defun F (L N)
(if L
((lambda (elem result)
(cons
(if (atom elem)
(+ elem N)
(F elem N))
result))
(car L)
(F (cdr L) N))))

Dremuk

Members


Статус

7 сообщений

Где: Belarus Лунинец
Род занятий:
Возраст: 36

#2112   2010-05-22 14:55 GMT+3 часа(ов)      
Спасибо большое.

LinkFly

Members


Статус

152 сообщений

Где: Russia
Род занятий:
Возраст:

#2120   2010-05-23 21:53 GMT+3 часа(ов)      
Вариант VH номер первый - прост, но груб.
номер второй - думаю не катит: есть неоправданная сложность.
К тому же постоянное определения лямбда-функции может съесть много ресурсов в какой-нибудь
реализации и вообще это решение выглядит крайне не производительным, кому не лень, проверьте.

Композиция функций предпочтительней. Особенно с выносом более общего метода map-tree.
Осталось переписать чуть декларативней и добавить хвостовую рекурсию для оптимизации:

(defun map-tree (f s)
(cond ((null s) nil)
((atom s) (funcall f s))
(t (cons (map-tree f (car s))
(map-tree f (cdr s))))))

(defun map-tree2 (fn tree &optional result &aux first-result)
(cond ((null tree) (reverse result))
((atom tree) (funcall fn tree))
(t (setq first-result (map-tree2 fn (first tree)))
(map-tree2 fn (rest tree) (cons first-result result)))))

(defun f (s n)
(map-tree (lambda (x) (+ x n))
s))

(defun f2(s n)
(map-tree2 (lambda (x) (+ x n))
s))

(setq ls '((1 (3) (1 3 (3 (4))) 3) 2))

(time (loop repeat 1000000
do (f ls 1)))
#|
Evaluation took:
0.555 seconds of real time
0.468029 seconds of total run time (0.432027 user, 0.036002 system)
[ Run times consist of 0.032 seconds GC time, and 0.437 seconds non-GC time. ]
84.32% CPU
1,330,663,392 processor cycles
120,050,016 bytes consed
|#

(time (loop repeat 100000
do (f2 ls 1)))
#|
0.154 seconds of real time
0.004000 seconds of total run time (0.004000 user, 0.000000 system)
[ Run times consist of 0.004 seconds GC time, and 0.000 seconds non-GC time. ]
2.60% CPU
369,178,029 processor cycles
22,410,536 bytes consed
|#
> 1 <


Онлайн :

0 пользователь(ей), 14 гость(ей) :




Реклама на сайте: