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

问题描述 投票:2回答:3

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

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

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

这将第一个元素作为-1 *返回该元素

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

但是让我说我​​希望它回归

-5 -1 -2 -3

如何让列表的其余部分为负数?递归使用cdr?

scheme
3个回答
3
投票

递归地做。

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

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

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


0
投票

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

至少自R4RS(即很久以前)以及可能更早以来,'map'已经可用。


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))))))
© www.soinside.com 2019 - 2024. All rights reserved.