如何将方案中的列表相乘?

时间:2018-04-10 00:36:34

标签: scheme

计划新手,但试图学习基础知识。

我们说我作为参数传递了一个列表,我希望将每个元素乘以-1。现在我有这个:

(define (negative b)
 (* (car b) -1 )))

返回第一个元素-1 *元素

所以在这种情况下,给它(negative '(5 1 2 3))会返回-5

但是我想让它返回

-5 -1 -2 -3

我如何才能使列表的其余部分为负?递归使用cdr?

3 个答案:

答案 0 :(得分:3)

递归地做。

(define (negative l)
  (if (null? l)
      '()
      (cons (* (car l) -1)
            (negative (cdr l)))))

如果列表为空,则只返回一个空列表,作为基本情况。

否则,它会计算-1 *第一个元素,列表其余部分的负数,并将它们组合起来产生结果。

答案 1 :(得分:0)

练习的目的可能是为了编写自己的地图程序,在这种情况下,这很好。但如果没有,请使用scheme的内置“map”程序,该程序仅用于此类目的。

'map'至少从R4RS(也就是很久以前)开始,可能更早。

答案 2 :(得分:0)

使用地图。如果你想将它作为列表返回。

就像这样

(define negative
  (lambda (b)
    (map - b)))

地图通过列表b,并将程序“ - ”应用于列表中的每个数字

如果您想要以不在列表中的单个数字的形式返回,请在列表中应用值。

(define negative1
  (lambda (b)
    (apply values (map - b))))

编辑:我看到你要求递归解决方案,这将是这样的

(define negative1
  (lambda (b)
    (if (null? b)
      '()
    (cons (- (car b)) (negative1 (cdr b))))))