2017-02-08 9 views
-1

Я не могу понять, как написать векторную функцию, которая возвращает первое нечетное число в списке.Схема: векторная функция, которая возвращает первое нечетное число

Ex: (check-expect (first-oddnumb 2 3 4 5 6) 3)) ;; он возвращает 3, потому что 3 - первое нечетное число в списке.

+1

вектор функция? Где здесь есть векторы? – Sylwester

ответ

0

Я не могу понять, как написать векторную функцию, которая возвращает первое нечетное число в списке.

Мое замешательство такое же, как @ 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