2017-02-08 8 views
-1

リストの最初の奇数を返すベクトル関数を書く方法を理解できません。Scheme:最初の奇数を返すベクトル関数

例:(check-expect(first-oddnumb 2 3 4 5 6)3));; 3がリストの最初の奇数であるため3を返します。

+1

ベクトル関数?ここにベクトルはどこにありますか? – Sylwester

答えて

0

リスト内の最初の奇数を返すベクトル関数を書く方法を理解できません。

私の混乱は@ 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 
関連する問題