如何在列表中添加括号?例如,
(乘以'(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。答案 0 :(得分: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))
您可以通过使用高阶函数来实现它:
(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
。