リストの最初の奇数を返すベクトル関数を書く方法を理解できません。Scheme:最初の奇数を返すベクトル関数
例:(check-expect(first-oddnumb 2 3 4 5 6)3));; 3がリストの最初の奇数であるため3を返します。
リストの最初の奇数を返すベクトル関数を書く方法を理解できません。Scheme:最初の奇数を返すベクトル関数
例:(check-expect(first-oddnumb 2 3 4 5 6)3));; 3がリストの最初の奇数であるため3を返します。
リスト内の最初の奇数を返すベクトル関数を書く方法を理解できません。
私の混乱は@ Sylwesterの「ベクトル関数」と同じですか?残りの質問は意味を成しているようだ。
リストの最初の奇数を返す関数を記述するのに役立ちます。
は、私たちは、関数が可変個の引数を受け取る関数を作成する方法を学習されて、私たちがしなければならない。この
(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
xs
の可能性のある状態についてお話しましょう (define (first-odd-number . xs)
;; so we know xs will be a list here ...
)
あなたの関数を書き始めることができますが、我々が何を返す必要があり、その場合には、空のだろうか?多分0
か何か?
(この後の詳細は)それ以外の場合は、xs
が少なくとも一つの番号を持っています...
xs
OKに残っている数字のfirst-odd-number
を返す、我々はかなり逐語的なラケットで
(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