我遇到这个问题。基本上,我需要一个程序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)
感谢您提供的任何帮助。
答案 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)适合的类型,除非你计划在几个地方使用它。