球拍-定义结构和抽象列表功能

时间:2019-11-22 04:44:03

标签: racket

我正在尝试创建一个函数games-won,该函数使用游戏列表,结果以及字符串,名称,并在games获胜的结果中产生name的数量。

例如:

(define-struct game (winner loser high low))
(check-expect (games-won (list (make-game "Lori" "Troy" 52 34)
                         (make-game "Mary" "Lori" 30 20)) "Lori") 1)

以下是我到目前为止的内容:

(define (won? game name)
  (equal? (game-winner game) name))

(define (wonlst results)
  (filter won? results))

(define (lst-length lst)
  (cond
    [(empty? lst)  0]
    [(cons? lst)   (+ 1 (length (rest lst)))]))

(define (games-won results)
 (cond
   [(cons? (wonlst results)) (lst-length (wonlst results))]
   [else 0]))

任何人都可以帮助纠正我的代码中的错误,或者告诉我如何使用local并将所有功能放在一起吗?

1 个答案:

答案 0 :(得分:0)

以下是修复程序:

  • 如测试所示,games-won应该接受两个参数:结果列表和名称。因此,我们向name添加了一个参数games-won
  • 您不需要自定义的lst-length函数,只需使用length。另外,games-won无需担心在0情况下返回else的情况。基本情况由列表摘要处理。
  • 请注意,won?接受两个输入,但是filter中的谓词功能仅接受一个输入。因此,我们从name中删除了won?。将won?放在本地后,就可以从周围函数的上下文中使用name
  • 我们将本地人放置在games-won中,并将两个助手-won?won-lst-放置在本地人中。
  • 您应该使用string=?而不是equal?,因为我们知道name的{​​{1}}和winner字段始终是字符串。
game

我们可以将所有内容与lambda放在一个函数中,如下所示:

(define-struct game (winner loser high low))

; games-won : [List-of Game] String -> Number
(define (games-won results name)
  (local (; won? : Game -> Boolean
          (define (won? game)
            (string=? (game-winner game) name))
          ; wonlst : [List-of Game] -> [List-of Game]
          (define (wonlst results)
            (filter won? results)))
    (length (wonlst results))))


(define my-games1 (list (make-game "Lori" "Troy" 52 34)
                        (make-game "Mary" "Lori" 30 20)))

(check-expect (games-won my-games1 "Lori") 1)

如何使用(define (games-won results name) (length (filter (λ (game) (string=? (game-winner game) name)) results)))

本地表达式具有以下形状:

local

在方括号内,您可以根据需要在本地的 body 中放置任意数量的定义(即(local [definition ...] body-expression) define)。 {1}}-您可以在方括号内放置任何可能使用或不使用定义的表达式。这些定义仅在正文中可用。

HtDP开始,这是我们如何使用本地语言进行计算:

  • 我们重命名本地定义的常量和函数,以使用程序中其他地方未使用的名称。

  • 我们将本地表达式中的定义提升到最高级别,然后评估本地表达式的主体。

相关问题