【问题标题】:Return alternate elements of 3 given lists. Scheme返回 3 个给定列表的替代元素。方案
【发布时间】:2016-08-03 13:40:03
【问题描述】:

这个过程应该返回一个包含来自 3 个给定列表的替代值的列表。例如 (alt ('a b c)'(1 2 3)'(i j k)) 应该返回 '(a 1 i b 2 j c 3 k)。

到目前为止,这是我的逻辑。我将获取每个列表的第一个元素,并以 cdr 作为新参数再次递归调用该过程。

(define (alternate lst1 lst2 lst3)
    (cons (car lst1)
          (cons (car lst2)
                (cons (car lst3)
                (alternate (cdr lst1)(cdr lst2)(cdr lst3))))))

错误发生在

(cons (car lst1)

“mcar:违反合同

预期:mpair?

给定()"

(cons a d) 返回一个新分配的对,其第一个元素是 a,第二个元素是 d。但既然给定的列表是 3 个而不是 2 个,还有其他方法可以创建列表吗?

这会是另一种方法吗?

(define (alternate lst1 lst2 lst3)
    (list (car lst1)(car lst2)(car lst3))
        (alternate (cdr lst1)(cdr lst2)(cdr lst3)))

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    您需要添加空列表检查以避免错误。所以你的代码应该是这样的:

    (define (alternate lst1 lst2 lst3)
      (if (or (null? lst1) (null? lst2) (null? lst3))
          '()
          (cons (car lst1)
            (cons (car lst2)
              (cons (car lst3)
                (alternate (cdr lst1)(cdr lst2)(cdr lst3)))))))
    

    如果你可以使用 SRFI-1(或者更准确地说是append-map),那么你也可以这样写:

    (define (alt l1 l2 l3) (append-map list l1 l2 l3))
    

    【讨论】:

    • 我明白了,这是有道理的。感谢您的回复。
    【解决方案2】:

    您可以只使用以下标准方案:

    (define (alternate . lists)
      (apply append (apply map list lists)))
    

    不是很优化,但可以完成工作:)

    评估:http://eval.ironscheme.net/?id=175

    【讨论】:

      猜你喜欢
      • 2012-10-30
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多