1

完成 Scheme 过程 (repeats-a-lot lst),该过程接受一个非负整数列表并返回一个列表,其中按顺序包含每个值表示等于其值的次数。请参阅下面的示例。您可以在解决方案中使用反向。您也可以在您的解决方案和本页背面使用帮助程序以获得更多空间。

注意:这不是家庭作业。这是一个练习题,我无法得到答案

4

1 回答 1

0

我会给你一些提示,这样你就可以自己解决这个练习题,填补空白。您可以做的第一件可能也是最有用的事情是将问题拆分为两个过程。第一个,给定一个数字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)
于 2012-12-15T00:30:53.027 回答