Scheme 方案-21点计划(SICP)/学习编程

Scheme 方案-21点计划(SICP)/学习编程,scheme,racket,sicp,Scheme,Racket,Sicp,我决定学习编程阅读/做SICP 我用的是DrRacket和 我写了一个21点程序。它起作用了 你能使这个程序更可读和简洁吗 我的评论太多了吗?评论不够?我如何使这个程序更好 我也在挑战。你能制定一个使用最优策略的程序,并使用n个样本大小确定玩家战胜庄家的概率吗?我将做同样的事情并比较代码 谢谢你的阅读/实践, 费尔南多·纳瓦有几点建议: 避免使用如此多的变异!。 避免重新定义内置函数,如长度。 向每个函数添加签名和目的声明。请参阅以获取解释。 编写测试!尝试使用rackunit,并记录在案 让我

我决定学习编程阅读/做SICP

我用的是DrRacket和

我写了一个21点程序。它起作用了

你能使这个程序更可读和简洁吗

我的评论太多了吗?评论不够?我如何使这个程序更好

我也在挑战。你能制定一个使用最优策略的程序,并使用n个样本大小确定玩家战胜庄家的概率吗?我将做同样的事情并比较代码

谢谢你的阅读/实践, 费尔南多·纳瓦有几点建议:

避免使用如此多的变异!。 避免重新定义内置函数,如长度。 向每个函数添加签名和目的声明。请参阅以获取解释。 编写测试!尝试使用rackunit,并记录在案
让我集中讨论一个单一的功能展示平台。我知道它在做什么,但是递归可以简化一点。让它更容易阅读可能效率稍低,但我们这里讨论的是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))
我们可以应用一种简化方法:使用这种方式表示的定义,可以更容易地看到map可以用于执行内部循环

这使得更容易看到外部迭代的结构。我们可以更进一步地将map用于内部和外部循环,并使用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)))

也许你应该试着用一个更难的方案变体来写。球拍是完全不同的,更容易。我个人不喜欢“如果”。我能看懂整个节目。
(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))
;; 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)))