Модератор: Модераторы разделов
adav84
Сообщения: 41
Сообщение
adav84 » 12.05.2011 00:51
Здравствуйте,
можно это упростить (и надо ли)?
Код: Выделить всё
(defun max (l)
(if (null l)
most-negative-fixnum
(if (> (car l) (max (cdr l)))
(car l)
(max (cdr l)))))
(max '(-2 -6 -1 -4))
в частности, повторные вызовы (или это оптимизируется?)
Без let и setq
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux
Сообщение
watashiwa_daredeska » 12.05.2011 01:15
adav84 писал(а): ↑ 12.05.2011 00:51
Без let и setq
А loop можно?
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux
Сообщение
watashiwa_daredeska » 12.05.2011 01:21
А вообще, в Common Lisp можно так:
Код: Выделить всё
(defun max2 (&optional l)
(apply 'max (cons most-negative-fixnum l)))
adav84
Сообщения: 41
Сообщение
adav84 » 12.05.2011 02:00
loop немного вульгарно :) мне бы с рекурсией....
просто повтор ((max (car l)) немного режет глаза и портит чувство Прекрасного
а еще то, что это не хвостовая рекурсия
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux
Сообщение
watashiwa_daredeska » 12.05.2011 10:08
adav84 писал(а): ↑ 12.05.2011 02:00
loop немного вульгарно :) мне бы с рекурсией....
А let-то чем не нравится? Вот с хвостовой рекурсией и с let. Если let не нравится — раскройте сами вручную.
Код: Выделить всё
(defun max3 (l &optional max-value)
(let ((max-value (if max-value max-value most-negative-fixnum)))
(if l (max3 (cdr l) (if (> max-value (car l)) max-value (car l))) max-value)))
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux
Сообщение
watashiwa_daredeska » 12.05.2011 11:08
Хотя, можно и без let:
Код: Выделить всё
(defun max3 (l &optional (max-value most-negative-fixnum))
(if l (max3 (cdr l) (if (> max-value (car l)) max-value (car l))) max-value))