如何在列表中添加()?

时间:2017-02-15 20:17:12

标签: list scheme multiplication

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

(乘以'(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。

1 个答案:

答案 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:学会在没有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

相关问题