将两个3个字符的列表合并为3对

时间:2013-11-12 02:33:05

标签: scheme lisp racket

我遇到这个问题。基本上,我需要一个程序comb,它需要两个列表(comb '(a b c) '(1 2 3)并返回('a 1)('b 2)('c 3)。我想出了一部分返回第一对的鳕鱼

(define some-letters '(a b c))
(define some-nums '(1 2 3))
(define x (first (foldr cons empty some-letters)))
(define y (first (foldr cons empty some-nums)))
(define (comb list1 list2)
  (cond
   [(empty? list1) empty]
   [(empty? list2) empty]
    [else (list x y)]))

现在,我修长了一点点,然后想出了comb有点不同的定义:

(define (comb list1 list2)
  (cond
   [(empty? list1) empty]
   [(empty? list2) empty]
    [else ((list x y) (zip (rest list1) (rest list2)))]))

但是会返回以下内容:

function call: expected a function after the open parenthesis, but received (list 'a 1)

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:2)

您的实施存在两个问题:

  • 您忘记cons正在构建的输出列表中的当前元素
  • 您将函数命名为comb,而不是zip(尽管此函数通常称为zip),因此在执行递归调用时必须使用comb

这解决了问题:

(define (comb list1 list2)
  (cond
    [(empty? list1) empty]
    [(empty? list2) empty]
    [else (cons (list (first list1) (first list2))
                (comb (rest list1) (rest list2)))]))

或者尝试使用更简单的实现,但需要注意的是只适用于长度相同的列表:

(define (comb list1 list2)
  (map list list1 list2))

答案 1 :(得分:0)

试试这个:

(defvar lst1'(a b c d e f))

(defvar lst2'(1 2 3 4 5))

请注意,列表的长度不同。

(defun 2list(x y)

(列表x y))

注2list是两个参数的函数,它们将它们组合成一个列表

(defun comb(lstA lstB)

(mapcar#'2list lstA lstB))

这应该返回((A 1)(B 2)(C 3)(D 4)(E 5))

mapcar在到达最短列表的末尾时停止,函数2list是匿名函数(lambdas)适合的类型,除非你计划在几个地方使用它。