创建重复元素列表的列表

时间:2013-09-29 16:26:37

标签: list scheme racket

这是我坚持的作业问题。我必须在不使用显式递归或本地的情况下在Racket中创建一个函数,它接受一对对的列表,其中每对的第一个元素是一个非负整数,并产生一个新的列表列表,其中每个列表是k每对中出现第二个元素,其中k是每对中的第一个元素。例如(expand-pairs(list(list 1 2)(list 3 4)))会产生(list(list 2)(list 4 4 4))

我得到了一些代码,但前提是第二个元素是一个数字。由于问题没有指定第二个元素是什么类型的元素,我认为它需要适用于任何元素。所以我的函数可以解决上面的例子,但无法解决(expand-pairs(list(list 1'a)(list 3'b)))。

这是我的代码:

(define (expand-pairs plst) 
  (map 
   (lambda (x) 
     (map 
      (lambda (y) (+ (first (rest x)) y)) 
      (build-list (first x) (lambda (z) (- z z)))))
   plst))

我的主要问题是我不知道如何在不使用递归或构建列表的情况下创建长度为k的列表,但是如果我使用build-list它会创建一个数字列表,我不知道如何将其转换为符号列表或任何其他元素。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:3)

这是另一种可能的实现,建立在@ RomanPekar的答案之上,但对于Racket更为惯用:

(define (expand-pairs lst)
  (map (lambda (s)
         (build-list (first s) (const (second s))))
       lst))

它使用高阶过程mapconstbuild-list来创建不使用显式递归或local的实现。这里的技巧是了解以下表达式将如何返回5的{​​{1}}个副本:

x

答案 1 :(得分:1)

这样的事情:

(define (expand-pairs plst)
  (map (lambda(x) (build-list (car x) (lambda(k) (cadr x)))) plst))

您不必在k中使用build-list,只需使用第二个元素。