按列表值重复列表中的值

时间:2012-12-14 23:56:56

标签: scheme mit-scheme

完成Scheme程序,(重复-st-lot lst),它接受一个非负inte的列表 热尔,并返回包含,为了一个列表,每个值表示的次数等于其数 值。见下面的例子。你可以在你的解决方案使用反向。您也可以使用辅助性亲 cedures在您的解决方案,而这个页面的更多的空间了。

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

1 个答案:

答案 0 :(得分: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)