【问题标题】:How can I add a () in a list?如何在列表中添加 ()?
【发布时间】:2017-02-15 20:17:12
【问题描述】:

如何在列表中添加括号?例如,

(乘 '(1 2) '(1 2 3))

它应该输出 ((1 2 3) (2 4 6))

这就是我现在拥有的

(define multiply
  (lambda (los1 los2)
    (cond
     ((null? los1) '())
     ((null? los2) '())
     (else (cons (* (car los1) (car los2))
         (append (multiply(list (car los1)) (cdr los2))
             (multiply(cdr los1) los2)))))))

我得到的输出是 (1 2 3 2 4 6)。

P/S:如果这是一个不好的问题或任何问题,请不要犹豫告诉我或责骂我。我正在尝试学习使用 stackoverflow。

【问题讨论】:

    标签: list scheme multiplication


    【解决方案1】:

    想想输入和输出的含义是什么。我想你不能用一个递归过程来做到这一点,但你可以用两个来做到这一点。

    (list-multiply 5 '(1 2 3)) 
    ; ==> (5 10 15)
    

    当您迭代第一个列表并为每个元素使用list-multiply 时,当然第二个参数永远不会被迭代,它只是被传递。

    (multiply '(1 2) '(1 2 3))
    ; ==> (cons (list-multiply 1 '(1 2 3))
    ;           (cons (list-multiply 2 '(1 2 3))
    ;                  '()))
    ; ==> ((1 2 3) (2 4 6))
    

    您可以简单地通过使用 fg 高阶函数来实现:

    (define (multiply lst1 lst2)
      (map (lambda (e1)
             (map (lambda (e2) (* e1 e2)) lst2))
           lst1))
    

    注意双重map。一个迭代 lst1 以在结果中生成元素,另一个 map 将一个元素与列表的每个元素相乘。您可能会想象,由于它们看起来很相似,因此这两个递归函数可能也有很多共同点。

    PS:学会在没有listappend 的情况下解决你的问题。 (list 1 2 3) 只是一个相当于(cons 1 (cons 2 (cons 3 '()))) 的过程,而(append '(1 2 3) '(4 5 6)) 相当于(cons 1 (cons 2 (cons 3 '(4 5 6))))。尝试始终从头到尾构建列表,如果您需要相反的内容,最后可能只需要reverse

    【讨论】:

      猜你喜欢
      • 2017-12-27
      • 1970-01-01
      • 2019-04-10
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多