2012-02-24 7 views
2

私はSICPの読み書きをプログラムすることを学ぶことに決めました。私はDrRacketとhttp://www.neilvandyke.org/racket-sicp/スキーム - ブラックジャックプログラム(SICP)/プログラム学習する

を使用してい

私はブラックジャックプログラムhttps://github.com/fnava621/scheme_blackjackを書きました。できます。

あなたはこのプログラムをより読みやすく簡潔にすることができますか?

私はあまりにも多くのコメントを入れましたか?コメントが足りない?このプログラムを「より良い」ものにするにはどうすればよいですか?

私はまた、拳銃を投げています。 「最適な」戦略を使用するプログラムを作って、プレーヤーがディーラーに対して勝つ確率(サンプルサイズをnとする)を決定できますか?私は同じことを行い、コードを比較します。やって/読み取るための

おかげで、 フェルナンド・ナバ

+0

多分もっと難しいスキームの変形で書くべきです。ラケットはかなり異なっています。私は個人的には「もしかしたら」が好きではない。私はプログラム全体を読んで理解することができます。 –

答えて

3

いくつかの提案:そんなに突然変異を使用して

  1. 避け、すなわちset!
  2. lengthのような組み込み関数を再定義しないでください。
  3. 各機能にシグネチャと目的のステートメントを追加します。説明はhereを参照してください。
  4. テストを書く! rackunitを使用してみてください、私は単一機能show-deckに焦点を当ててみましょうhere
+0

ありがとう!!!!!!!!!!!!! – nava

2

を記録しました。私はそれが何をしているのか見ていますが、再帰を少し簡略化することができます。読むのが楽になるかもしれませんが、ここでは52枚のカードについて話しています。:)

内側のループと外側のループは、元のコードに絡まっています。

(define (show-deck1 first-list second-list) 
    (define (outer-loop first-list second-list) 
    (cond 
     ((null? first-list) 
     '()) 
     (else 
     (append (inner-loop (car first-list) second-list) 
       (outer-loop (cdr first-list) second-list))))) 

    (define (inner-loop x second-list) 
    (cond 
     ((null? second-list) 
     '()) 
     (else 
     (cons (cons x (car second-list)) 
      (inner-loop x (cdr second-list)))))) 

    (outer-loop first-list second-list)) 

我々は簡素化を適用することができます:ここではそれらをdisentanglesバージョンは1つの定義がこのように表現して、それはmapinner-loopを行うために使用できることを確認するために簡単です。

(define (show-deck2 first-list second-list) 
    (cond 
    ((null? first-list) 
    '()) 
    (else 
    (define x (car first-list)) 
    (append (map (lambda (y) (cons x y)) second-list) 
      (show-deck2 (cdr first-list) second-list))))) 

これにより、外側の繰り返しの構造がわかりやすくなります。私たちは、mapさらに一歩取り、両方の内側と外側のloopingsのためにそれを使用し、mapのネストされた使用により導入された下部を平らにする(apply append ...)を使用することができます。

(define (show-deck3 first-list second-list) 
    (apply append 
     (map (lambda (x) 
       (map (lambda (y) (cons x y)) second-list)) 
       first-list))) 

バージョンが巧みで完全(apply append ...)ものを避けます計算をスレッド化していますが、読みやすさを犠牲にしています。 (apply append ...)を避け、まだ簡単にネストされたループ構造を見ての利点はfoldrアプローチではなく、mapアプローチを使用することで取得するための一つの方法:

(define (foldr f acc l) 
    (cond 
    ((null? l) acc) 
    (else 
    (f (car l) 
     (foldr f acc (cdr l)))))) 

(define (show-deck first-list second-list) 
    (foldr (lambda (x acc) 
      (foldr (lambda (y acc) 
        (cons (cons x y) acc)) 
        acc 
        second-list)) 
     '() 
     first-list)) 

これはあなたの元のコードは、前にやったことと一致する必要があります。しかし、ループの度合いはfoldrになります。そのため、iterの関数はすべてfoldrの使用に消えます。

個人的に、私が完全なラケットを書いているならば、私はちょうどforループでそれをコードしたいと思います。 :)これは次のようになります:

;; If we're allowed to use full Racket: 
(define (show-deck first-list second-list) 
    (for*/list ([x first-list] 
       [y second-list]) 
    (cons x y))) 
+0

ありがとう!!!!!!!!!!! – nava