0

我对此有点麻烦。基本上,我需要一个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)

如果您能提供任何帮助,我将不胜感激。

4

2 回答 2

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))
于 2013-11-12T03:03:57.717 回答
0

试试这个:

(defvar lst1 '(abcdef))

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

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

(defun 2list (xy)

(列表 xy))

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

(defun 梳子 (lstA lstB)

(mapcar #'2list lstA lstB))

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

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

于 2013-11-16T22:49:12.583 回答