【问题标题】: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:学会在没有list 和append 的情况下解决你的问题。 (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。