我有值列表,并想从中获取第一个 x 值并创建 (list (listof first x values) (listof next x values) 等等,直到这个列表变空...)。
例如,给定这个列表:(list "a" "b" "c" "d" "e" "f" "g" "h" "t")
返回这个:(list (list a" "b" "c") (list "d" "e" "f") (list "g" "h" "t"))
提前致谢 :)
我有值列表,并想从中获取第一个 x 值并创建 (list (listof first x values) (listof next x values) 等等,直到这个列表变空...)。
例如,给定这个列表:(list "a" "b" "c" "d" "e" "f" "g" "h" "t")
返回这个:(list (list a" "b" "c") (list "d" "e" "f") (list "g" "h" "t"))
提前致谢 :)
记住列表的数据类型是什么。您的班级可能正在做类似的事情:
;; A IntegerList is one of:
;; - '()
;; - (cons Integer IntegerList)
鉴于此,您的模板应该反映这种结构。我将解决基本情况(我们希望将整数列表转换为一个整数的列表。
首先,我将定义一个1List
数据类型:
;; a 1List is:
;; - (cons Integer '())
接下来,函数的目的声明和签名将是:
;; Takes a list of integers and returns a list of 1Lists of the same integers
;; IntegerList -> 1List
(define (make-1list lst)
...)
好的酷。现在我们需要测试用例:
(check-expect (make-1list (list 1 2 3)) (list (list 1) (list 2) (list 3)))
(check-expect (make-1list (list)) (list))
(check-expect (make-1list (list 42)) (list (list 42)))
最后,我可以制作我的模板:
(define (make-1list lst)
(cond [(null? lst) ...]
[else ... (first lst) ... (rest lst) ...]))
(请注意,有时先制作一些模板是有意义的,以帮助您指导所需的测试。)
最后,我们可以填写我们的代码:
(define (make-1list lst)
(cond [(null? lst) '()]
[else (cons (list (first lst)) (make-1list (rest lst)))]))
最后,示例也是测试,所以我们只需要运行它们以确保一切正常。
现在,既然你想制作3List
s 而不是1List
s,你知道如何按照这个秘诀来解决问题吗?
遵循此模式应该可以帮助您将问题分解为更小的步骤。祝你好运。
完成此任务的更好方法是使用累加器和递归。