наибольшее число (Lisp, Scheme)

Модератор: Модераторы разделов

adav84
Сообщения: 41

наибольшее число

Сообщение adav84 »

Здравствуйте,
можно это упростить (и надо ли)?

Код: Выделить всё

(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

Re: наибольшее число

Сообщение watashiwa_daredeska »

adav84 писал(а):
12.05.2011 00:51
Без let и setq
А loop можно?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: наибольшее число

Сообщение watashiwa_daredeska »

А вообще, в Common Lisp можно так:

Код: Выделить всё

(defun max2 (&optional l)
  (apply 'max (cons most-negative-fixnum l)))
Спасибо сказали:
adav84
Сообщения: 41

Re: наибольшее число

Сообщение adav84 »

watashiwa_daredeska писал(а):
12.05.2011 01:15
adav84 писал(а):
12.05.2011 00:51
Без let и setq
А loop можно?

loop немного вульгарно :) мне бы с рекурсией....
просто повтор ((max (car l)) немного режет глаза и портит чувство Прекрасного
а еще то, что это не хвостовая рекурсия
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: наибольшее число

Сообщение watashiwa_daredeska »

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

Re: наибольшее число

Сообщение watashiwa_daredeska »

Хотя, можно и без 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))
Спасибо сказали: