Как вы сравниваете 3 или более аргументов в рэкете?

Я знаю, что в Racket для сравнения, например, двух чисел у вас будет что-то вроде этого.

  (define (myMax x y)
           (if (< x y) y x))

Мой вопрос в том, как вы сравниваете функцию с 3 или более аргументами. Например, чтобы получить наибольшее число из аргументов.

(define (myMax x y z)

person Nefton    schedule 10.03.2021    source источник
comment
Для этого можно использовать встроенную процедуру max.   -  person Óscar López    schedule 11.03.2021


Ответы (1)


Если вы хотите обработать неопределенное количество элементов, вам нужно работать с list.

Идиоматический способ - использовать recursion для обработки элементов. Каждый вызов функции должен обрабатывать один элемент (car) и остальную часть списка cdr.

Вы можете найти реализацию в другом сообщении: https://stackoverflow.com/a/42463097/10953006

РЕДАКТИРОВАТЬ 1: ПРИМЕР

(define (maximum L)
     (if (null? (cdr L)) 
         (car L) 
         (if (< (car L) (maximum (cdr L)))  
             (maximum (cdr L)) 
             (car L))))

(maximum '( 1 2 3 ))
(maximum '( 1 2 3 4))
(maximum '( 1 2 3 4 5))

Дайте результаты:

3
4
5

РЕДАКТИРОВАТЬ 2: если реальный вопрос касается variable number of arguments в Racket, вы можете использовать следующую запись:

(define (test-function . L)
  (printf "~S~%" L)) ;; Here: L is the list (1 2 3)

(test-function 1 2 3)

Который будет отображать (printf):

(1 2 3)
person Robert    schedule 11.03.2021
comment
Я не знаю причину, по которой меня заминусовали. Перед публикацией этого ответа я протестировал код в Racket IDE и предоставил реализацию myMax, которая работает со списком. - person Robert; 11.03.2021