C 311初回作業収穫/薄めby hugzh

4682 ワード

ユニットテスト


テストを書くメリットは、スクリーンを見つめずに何十も走る必要があるときに、目で見るのが予想に合っているかどうかが非常に2つの行為です.△商用品は何万ものテストがあるのが普通です...自分で開発しても、非常に簡単で、関数の結果を予想するテストを書くべきです.もちろんテストだけでは足りませんが、自分が書いたものに自信を持って、十分な状況をカバーしていると信じています.「正しい」とも言える(すべての場合に正しい行為を示す)カリキュラムの要求通りThe objective is not simply to write programs that get the correct answers; it is to write answers in the style of programs written in class.
事前にテストを書き出して、実装を書く方法をテスト駆動開発(TDD)と言いますが、TDDは小さな関数階層で使うのが役に立つと思います.結局、1つの関数が小さいほど、その行為は予測しやすいでしょう.
検証結果を容易にするだけではありません.テスト用例の一行を直接持って、対応する実参を形参に変えると、より良いパラメータの名前が思いつくことが多い.
Racketが持っているテストフレームワークはrackunitと呼ばれていますhttp://docs.racket-lang.org/rackunit/api.html
この作業で持参したテストは大体長いので、具体的には自分で検討してください.
    (test-suite "countdown"
      (test-equal-if-defined countdown
        ((countdown 5) '(5 4 3 2 1 0))))

また、テスト結果にはfailureとerrorの区別があります.例えば、関数が定義されていない、failureだと思っているのは、確かに関数の論理が間違っていて、errorだと思っています.

Natural Recursion


Natural Recursion、あるいはnaturally recursiveは、直接理解すると自然な再帰である.この言葉は長い間探していたが,正確な意味が見つからなかった.
これを参考にしてhttp://web.mit.edu/6.005/www/fa15/classes/10-recursion/Think about several ways to break down the problem, and try to write the recursive steps. You want to find the one that produces the simplest, most natural recursive step.であり、すべての問題は、中間結果をaccumulatorで格納することも許されない.
一応分治法で問題を解決し,原問題をより小さなサブ問題に変換し,trivialの場合に明らかな解を返すと考えられる.問題を解く.あるいは逆に言えば,より小さな問題の解を与える前提の下で,より大きな問題の解をどのように得るか.すなわち,いわゆる繰返し式,数学的帰納である.例を挙げる
(define (countdown n)
  (if (= n -1)
      '()
      (cons n (countdown (- n 1)))))

(countdown N)は、Nから0までのリストを返します.ここでの実装は、n==1の場合、trivial caseは、空のテーブルに直接戻ります.そうでなければ、N consを(countdown(-n 1))に戻した結果を返します.
多くのデータ型は再帰データ型と見なすことができ、lispのlistは、実は単一のチェーンテーブルであり、チェーンテーブルは空のテーブルであってもよいし、Head要素が別のチェーンテーブルを指していてもよい.これがいわゆる再帰定義です.
文字列、文字列には多くのカット方法があり、先頭要素+文字列または文字列+末尾要素または中間カット文字列+と見なすことができます..+文字列
自然数は0またはある自然数の後継(後継とは数であり、0の後継は1であり、1の後継は2(0の後継の後継)であり、このように推す)
分治法についてアルゴリズムの授業を補うことができて、MIT 6.006/6.046はすべてできます.
私はずっと分治とダイナミックな計画がほとんど同じだと感じていました..すべてサブ問題に変換して、base caseは直接解があります.

BrainTeaser /Just Dessert


この2つのユニットはいずれも難題で、いろいろな奇妙で面白いものに遭遇します.難しすぎて全然できません.感嘆する人は自覚の明が必要ですね.もしこれらのものと死ぬのが長すぎると、時間を費やしても何も得られないのではないでしょうか.

collatz

(define collatz
  (letrec
      ([odd-case
        (lambda (recur)
          (lambda (x)
            (cond 
              ((and (positive? x) (odd? x)) (collatz (add1 (* x 3)))) 
              (else (recur x)))))]
       [even-case
        (lambda (recur)
          (lambda (x)
            (cond 
              ((and (positive? x) (even? x)) (collatz (/ x 2))) 
              (else (recur x)))))]
       [one-case
        (lambda (recur)
          (lambda (x)
            (cond
              ((zero? (sub1 x)) 1)
              (else (recur x)))))]
       [base
        (lambda (x)
          (error 'error "Invalid value ~s~n" x))])
    (one-case (odd-case (even-case base)));; this should be a single line, without lambda
    ))

今回のBrainTeaserはcollatzという面白いプログラムで、caseごとにパラメータを出口として持ってからnumber->numberに戻ることに気づきました.つまり(number->number)->(number->number) baseだけがnumber->number
そして各caseを組み合わせて、すべてのcaseを考慮したnumber->numberを得ることができます.
base:number->number
odd-case (number->number)->(number->number)
(even-case base) : (number->number)

あとはこう推す

quine


quineはこのようなプログラムで、あなたはそれに値を求めて、プログラムの元のコード自体を返します.つまり、得たものを再就職し、元のコードそのものを得るということです.そして宿題は自分でquineを作ってもらうことです..まさか...quineリファレンスリンクhttps://en.wikipedia.org/wiki/Quine_%28computing%29 http://www.nyx.net/~gthompso/quine.htm

あとがき


厚かましく自分の答えを貼るhttps://github.com/hgztheyoung/c311/blob/master/c311recap/a1.rktRacket大法はいいですね.#;次の括弧の内容をコメントできます.意味レベルの注釈は使いやすいですね.注釈は画像を加えることができます.いい機能ですね.(もちろん作業に追加することはできません.テストフレームワークと衝突します.)Racketのドキュメントの品質は本当に高いです.プログラムの中で分からないものに出会ったら、例えばmatchとかletrecとか、直接右クリックして、ドキュメントを見ればいいです.もちろんthe little schemer/the seasoned schemerを直接見てもいいです.DrRacketは式を再構築する機能があり、使いやすく、右クリックしてXXXの名前を変更すればいい.ただし、重複定義、構文エラーなど、ファイル全体にエラーがないことが求められます.インデント、すべて選択、Tab.できます.Racketの()、[]と{}という意味で、[]は美観的な役割を果たす.私の慣用法は
(let ((x 2)
      (y 3))
  (+ x y))
(cond
    ((eq? #t #t) 1)
    (else 2))
(match x
    (1  2)
    (#t 3))

と書く
(let ([x 2]
      [y 3])
  (+ x y))
(cond
    [(eq? #t #t) 1]
    [else 2])
(match x
    [1 2]
    [#t 3])

この破れた文はまた多くの役に立たないことを引っ張りました...
自分でまじめに宿題をしてこそ収穫がある.仕事は探しにくいですね.
私は乞食をして広告を出して芸を売って寄付を求めている.唯一指定されたメールボックスは[email protected]