这是一个我卡住的作业问题。我需要在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)))。
以下是我的代码:
我的主要问题是我不知道如何创建一个长度为k的列表,而不使用递归或build-list,但是如果我使用build-list,它会创建一个数字列表,我不知道如何将其转换为符号或其他元素的列表。
有谁能指点一下我正确的方向吗?
我已经编写了一些代码,但仅适用于第二个元素为数字的情况。由于问题没有指定第二个元素的类型,因此我假设它需要适用于任何元素。因此,我的函数可以解决上面的示例,但无法解决(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,但是如果我使用build-list,它会创建一个数字列表,我不知道如何将其转换为符号或其他元素的列表。
有谁能指点一下我正确的方向吗?
cons
的返回值,即一个点对,一个cons单元。这与两个元素的列表不同,因为(1 2) == (1 . (2 . ()))
需要两个cons单元。我之所以指出这一点,是因为基于函数“接受一对列表”的规范,使用案例(expand-pairs (list (list 1 2) (list 3 4)))
有些令人惊讶。它可以是(expand-pairs (list (cons 1 2) (cons 3 4))) == (expand-pairs '((1 . 2) (3 . 4)))
。 - Joshua Taylor