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
案例有两个子部分,first
和rest
。;; 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/