3

这是我坚持的家庭作业问题。我必须在不使用显式递归或本地的情况下在 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 的列表,但是如果我使用构建列表,它会创建一个数字列表,我不知道如何转换它到符号列表或任何其他元素。

谁能指出我正确的方向?

4

2 回答 2

3

这是另一种可能的实现,建立在@RomanPekar's answer的基础上,但对于 Racket 来说更惯用:

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

它利用了高阶过程mapconstbuild-list在不使用显式递归或local. 这里的诀窍是了解以下表达式将如何返回5的副本x

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

=> '(x x x x x)
于 2013-09-29T22:55:53.997 回答
1

像这样的东西:

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

您不必在 中使用,只需使用对的第二个元素kbuild-list

于 2013-09-29T16:46:25.837 回答