For example:
• (sum empty) ⇒ 0
• (sum (list 1 2 3)) ⇒ 6
• (sum (list 1 (list 2) 3 (list 4 5))) ⇒ 15

到目前为止,我有什么。它计算列表中数字的总和。该测试通过了一些示例。但是,我不知道如何添加是否包含数字,例如示例3。
(define (sum lloi)
  (cond
    [(empty? lloi) 0]
    [else (+ (first lloi) (sum (rest lloi)))]))



最佳答案

这是我如何使用How to Design Programs中的“设计食谱”的部分系统地设计此类功能的方法。

输入是一个可能包含数字和数字列表的列表。现在,我假设列表可以嵌套得更多。允许任意嵌套的列表,将使输入成为一棵数字树,而不仅仅是列表。

;; A NumTree is one of:
;;  - Number
;;  - [Listof NumTree]

;; sum : NumTree -> Number
(define (sum nt)
  ???)

上面的数据定义中的“一个”表示该功能应使用条件语句,并为“一个”中的每个项目符号问题。
;; sum : NumTree -> Number
(define (sum nt)
  (cond [(number? nt) ???]
        [(list? nt) ???]))

在数据定义的情况下,它们不是任何“子部分”,因此下一步是找到对复杂数据定义的引用,包括自引用,并为这些插入辅助功能。 [Listof NumTree]是一个复杂的数据定义,因此请使用辅助函数进行汇总。

首先将此功能添加到“愿望清单”中,稍后再返回。
;; sum-listofnumtree : [Listof NumTree] -> Number
(define (sum-listof-numtree lont)
  ???)

现在,它已出现在您的愿望清单中,使用它来完成其余sum的定义。
;; sum : NumTree -> Number
(define (sum nt)
  (cond [(number? nt) nt]
        [(list? nt) (sum-listof-numtree nt)]))

现在,一旦完成,就返回您的愿望清单,并处理sum-listof-numtree。同样,您可以基于数据定义,这一次是Listof
;; A [Listof NumTree] is one of:
;;  - '()
;;  - (cons NumTree [Listof NumTree])

;; sum-listofnumtree : [Listof NumTree] -> Number
(define (sum-listof-numtree lont)
  ???)

再次,“其中一个”变成cond,每个项目符号点都有一个分支。
;; sum-listofnumtree : [Listof NumTree] -> Number
(define (sum-listof-numtree lont)
  (cond [(empty? lont) ???]
        [(cons? lont) ???]))

在此,cons案例有两个子部分,firstrest
;; sum-listofnumtree : [Listof NumTree] -> Number
(define (sum-listof-numtree lont)
  (cond [(empty? lont) ???]
        [(cons? lont) (.... (first lont) (rest lont) ....)]))

下一步是查看是否有任何子部分是复杂的数据定义,如果有,则插入辅助函数。在这种情况下,两者都是复杂数据。 (first lont)NumTree(rest lont)[Listof NumTree]

此处NumTree的“帮助程序”功能是sum,因此在模板中可以使用(sum (first lont))[Listof NumTree]的“helper”功能是sum-listof-numtree,因此您可以使用(sum-listof-numtree (rest lont))
;; sum-listofnumtree : [Listof NumTree] -> Number
(define (sum-listof-numtree lont)
  (cond [(empty? lont) ???]
        [(cons? lont) (.... (sum (first lont)) (sum-listof-numtree (rest lont)) ....)]))

现在,只需进行有意义的填充即可。
;; sum-listofnumtree : [Listof NumTree] -> Number
(define (sum-listof-numtree lont)
  (cond [(empty? lont) 0]
        [(cons? lont) (+ (sum (first lont)) (sum-listof-numtree (rest lont)))]))

这些组合在一起,形成一对相互递归的函数,对一对相互递归的数据定义进行操作。
;; A NumTree is one of:
;;  - Number
;;  - [Listof NumTree]

;; A [Listof NumTree] is one of:
;;  - '()
;;  - (cons NumTree [Listof NumTree])

;; sum : NumTree -> Number
(define (sum nt)
  (cond [(number? nt) nt]
        [(list? nt) (sum-listof-numtree nt)]))

;; sum-listofnumtree : [Listof NumTree] -> Number
(define (sum-listof-numtree lont)
  (cond [(empty? lont) 0]
        [(cons? lont) (+ (sum (first lont)) (sum-listof-numtree (rest lont)))]))

关于scheme - 如何在 Racket 中添加列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60609189/

10-09 22:11