> 1 <

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

incredible1000

Members


Статус

4 сообщений

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

#4373   2011-05-25 13:46 GMT+3 часа(ов)      
Написал прогу выводящую последние n символов(т.е. функцию last).

(defun len(lst)
(cond
((null lst) 0)
((+ 1 (len (cdr lst))))
)
)

(defun my-last(lst num)
(cond
((< (len lst) num) NIL)
((= (len lst) num) lst)
((> (len lst) num) (my-last (cdr lst) num))
)

)

(my-last '(1 2 3)'2)


Не могу написать прогу реализующую butlast(вывод первых n элементов). Вход: (my-butlast '(1 2 3 4 5)'2) Выход: (1 2)
Помогите пожалуйста!

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#4375   2011-05-25 15:33 GMT+3 часа(ов)      
butlast возвращает не первые n элементов, а все, кроме n последних.
Вот простейшее, но крайне неоптимальное по производительности, решение:
(defun %butlast (list &optional (n 1))
(reverse (nthcdr n (reverse list))))

incredible1000

Members


Статус

4 сообщений

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

#4380   2011-05-25 16:37 GMT+3 часа(ов)      
Просто мне надо реализовать ее без продвинутых функций nthcdr и reverse. только c помощью базовых car и cdr, cond, cons...

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#4382   2011-05-25 16:58 GMT+3 часа(ов)      
(defun %nthcdr (list n)
(if (= 0 n) list
(%nthcdr (cdr list)
(1- n))))
 
(defun %reverse (list)
(when list
(append (%reverse (cdr list))
(list (car list)))))
 
(defun %butlast (list &optional (n 1))
(%reverse (%nthcdr n (%reverse list))))
> 1 <


Онлайн :

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