List 创建重复元素列表的列表

List 创建重复元素列表的列表,list,scheme,racket,List,Scheme,Racket,这是我一直在做的作业问题。我必须在Racket中创建一个函数,而不使用显式递归或局部,它接受一个对列表,其中每对的第一个元素是非负整数,并生成一个新的列表,其中每个列表是每对中第二个元素的k个引用,其中k是每对的第一个元素。例如(展开对(列表(列表12)(列表34))将产生(列表(列表2)(列表4)) 我得到了一些代码,但只有当第二个元素是数字时。因为问题没有指定第二个元素是什么类型的元素,所以我假设它需要适用于任何元素。因此,我的函数可以解决上述示例,但不能解决(展开对(list(list 1

这是我一直在做的作业问题。我必须在Racket中创建一个函数,而不使用显式递归或局部,它接受一个对列表,其中每对的第一个元素是非负整数,并生成一个新的列表,其中每个列表是每对中第二个元素的k个引用,其中k是每对的第一个元素。例如(展开对(列表(列表12)(列表34))将产生(列表(列表2)(列表4))

我得到了一些代码,但只有当第二个元素是数字时。因为问题没有指定第二个元素是什么类型的元素,所以我假设它需要适用于任何元素。因此,我的函数可以解决上述示例,但不能解决(展开对(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的列表,但是如果我使用构建列表,它会创建一个数字列表,我不知道如何将其转换为符号列表或任何其他元素

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

类似这样的:

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

您不必在
构建列表中使用
k
,只需获取对中的第二个元素。

这里是另一个可能的实现,基于@RomanPekar的答案,但对于Racket来说更为惯用:

(define (expand-pairs lst)
  (map (lambda (s)
         (build-list (first s) (const (second s))))
       lst))
它使用高阶过程,并在不使用显式递归或
local
的情况下创建实现。这里的技巧是理解以下表达式如何返回
x
5个副本:

(build-list 5 (const  'x))
            ^    ^     ^
      #copies constant element

=> '(x x x x x)

我一点也不是球拍专家,但看起来在这里使用
const
确实更具球拍性,所以+1这是一种球拍。除了您在这里得到的答案之外,您还可以从中得到启发(还有各种Lisp(Clojure、Common Lisp和Scheme)的代码)。这里的任务是压缩和解压字符串(相对于列表列表),但是一些技术可能仍然有用。在Scheme中,pair通常表示
cons
的返回值,即点对,cons单元格。这与包含两个元素的列表不同,后者实际上需要两个cons单元格,因为
(12)==(1.(2)()
。我之所以指出这一点,是因为基于函数“接受对列表”的规范,这使得用例
(展开对(列表(列表12)(列表34))
有点令人惊讶。它可能是
(展开对(列表(cons12)(cons34))==(展开对’((1.2)(3.4))