【问题标题】:Combine two lists of 3 characters into 3 pairs将两个 3 个字符的列表组合成 3 对
【发布时间】:2013-11-12 02:33:04
【问题描述】:

我遇到了一些麻烦。基本上,我需要一个过程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)

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

【问题讨论】:

    标签: scheme lisp racket


    【解决方案1】:

    您的实现存在两个问题:

    • 您忘记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))
    

    【讨论】:

      【解决方案2】:

      试试这个:

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

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

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

      (defun 2list (x y)

      (列表 x y))

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

      (defun 梳 (lstA lstB)

      (mapcar #'2list lstA lstB))

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-24
        • 2014-09-30
        • 2019-04-11
        相关资源
        最近更新 更多