Я не могу понять, как написать векторную функцию, которая возвращает первое нечетное число в списке.
Мое замешательство такое же, как @ Sylwester's: «векторная функция»? Остальная часть вопроса, похоже, имеет смысл.
Я могу помочь вам написать функцию, которая возвращает первое нечетное число в списке .
Мы хотим, чтобы функция работать как этот
(first-odd-number 2 3 4 5 6) ;; => 3
Поэтому первое, что мы должны сделать, это узнать, как написать функцию, которая принимает переменное число аргументов
(define (variadic . xs) xs)
(variadic 1 2) ;; => '(1 2)
(variadic 1 2 3) ;; => '(1 2 3)
(variadic 1 2 3 4) ;; => '(1 2 3 4)
(variadic) ;; => '()
Обратите внимание на .
перед параметром xs
. Это дает нам способ собрать все переданные аргументы в связанный идентификатор, xs
. Обратите внимание, как аргументы собираются в список . Также обратите внимание на то, как xs
по-прежнему будет списком (пустой список '()
), даже если в вызове функции не указаны аргументы.
Теперь мы можем начать писать вашу функцию
(define (first-odd-number . xs)
;; so we know xs will be a list here ...
)
Давайте поговорим о возможных состояниях xs
xs
может быть пустым, в этом случае, что мы должны вернуться? может быть, 0
или что-то в этом роде? (Подробнее об этом позже)
В противном случае, xs
имеет по крайней мере один номер ...
- является первым числом нечетного числа? если да, верните это число
- - это первое число четное число? если да, то возвращают
first-odd-number
остальных чисел в xs
ОК, мы можем в значительной степени определить это в Ракетка дословное
(define (first-odd-number . xs)
;; begin case analysis of xs
(cond
;; is the list of numbers empty? return 0
[(empty? xs) 0]
;; the list is not empty, continue ...
;; is the first number odd?
[(odd? (car xs)) (car xs)]
;; otherwise...
;; the number even, check remaining numbers
[else (apply first-odd-number (cdr xs))]))
(first-odd-number 2 3 4 5 6) ;; => 3
(first-odd-number 3 4 5 6) ;; => 3
(first-odd-number 4 5 6) ;; => 5
(first-odd-number) ;; => 0
И это довольно много его!
Усовершенствования ...
Если вы похожи на меня, то 0
заставляет вас чувствовать себя неловко. Что делать, если вам был предоставлен список только даже номеров? Какова должна быть обратная стоимость?
(first-odd-number 2 4 6) ;; => 0
Это странно. Мы могли бы использовать 0
означает, что ни нечетное число не было найдено, но Может есть лучший путь ...
(struct Just (value) #:transparent)
(struct None() #:transparent)
(define (first-odd-number . xs)
(cond
;; no odd number was found; return None
[(empty? xs) (None)]
;; an odd number was found, return (Just n)
[(odd? (car xs)) (Just (car xs))]
;; otherwise check the remaining numbers
[else (apply first-odd-number (cdr xs))]))
(first-odd-number 2 3 4 5 6) ;; => (Just 3)
(first-odd-number 3 4 5 6) ;; => (Just 3)
(first-odd-number 4 5 6) ;; => (Just 5)
(first-odd-number) ;; => (None)
Теперь, когда абонент нашей first-odd-number
работает с функцией, мы не имеем не нужно помнить, что 0
является частным случаем, мы должны рассмотреть
(define (print-the-first-odd-number . xs)
(match (apply first-odd-number xs)
[(Just x) (printf "the number is ~a\n" x)]
[(None) (printf "no odd number was found\n")]))
(print-the-first-odd-number 2 3 4 5 6) ;; the number is 3
(print-the-first-odd-number 2 4 6) ;; no odd number was found
вектор функция? Где здесь есть векторы? – Sylwester