完成 Scheme 过程 (repeats-a-lot lst),该过程接受一个非负整数列表并返回一个列表,其中按顺序包含每个值表示等于其值的次数。请参阅下面的示例。您可以在解决方案中使用反向。您也可以在您的解决方案和本页背面使用帮助程序以获得更多空间。
注意:这不是家庭作业。这是一个练习题,我无法得到答案
完成 Scheme 过程 (repeats-a-lot lst),该过程接受一个非负整数列表并返回一个列表,其中按顺序包含每个值表示等于其值的次数。请参阅下面的示例。您可以在解决方案中使用反向。您也可以在您的解决方案和本页背面使用帮助程序以获得更多空间。
注意:这不是家庭作业。这是一个练习题,我无法得到答案
我会给你一些提示,这样你就可以自己解决这个练习题,填补空白。您可以做的第一件可能也是最有用的事情是将问题拆分为两个过程。第一个,给定一个数字n
,负责生成一个i
重复的列表n
:
(define (repeat n i)
(if (zero? i) ; if no more repeats are needed
<???> ; return the empty list
(cons <???> ; else cons `n` and advance the recursion
(repeat <???> ; `n` is left unchanged
<???>)))) ; but `i` is diminished by one
第二个过程使用前一个作为助手,遍历输入lst
并组合由 生成的所有子列表的结果repeat
:
(define (repeats-a-lot lst)
(if (null? lst) ; if the list is empty
<???> ; return the empty list
(append (repeat <???> <???>) ; append n repetitions of current element
(repeats-a-lot <???>)))) ; and advance the recursion over the list
有几种可能的方法来解决这个问题,有些更奇特(使用尾递归,使用折叠过程等),但恕我直言,这是最简单的方法,因为它只需要一些基本列表操作过程的知识。无论如何,它按预期工作:
(repeats-a-lot '(1 2 3))
=> '(1 2 2 3 3 3)