【问题标题】:How to multiply a list in scheme?如何在方案中乘以列表?
【发布时间】:2018-04-10 00:36:34
【问题描述】:

刚接触计划,但正在努力学习基础知识。

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

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

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

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

但是可以说我希望它返回

-5 -1 -2 -3

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

【问题讨论】:

  • 第一个参数的目的是什么?
  • 什么是-5 -1 -2 -3?你能做出一个产生那个奇怪值的表达式吗?

标签: scheme


【解决方案1】:

递归执行。

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

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

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

【讨论】:

  • @jpyams 使用像样的代码编辑器时不会发生这种情况,但是 SO 编辑器无法帮助您平衡括号。我在 SO 上的每种语言都有这个问题。
  • SO 的 emacs 模式真的很容易安装:github.com/vermiculus/sx.el
  • @coredump 不错,但我仍在 Mac 上运行 Emacs 22.x(我有大量旧的 Emacs 附加组件不适用于新版本)。
【解决方案2】:

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

'map' 至少从 R4RS 开始(即很久以前)就已经可用,并且可能更早。

【讨论】:

    【解决方案3】:

    通过使用地图。如果您希望它作为列表返回。

    应该是这样的

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

    Map 正在遍历列表 b,并将过程“-”应用于列表中的每个数字

    如果您想作为不在列表中的单个数字返回,则在列表中应用值。

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

    编辑:我看到你要求递归解决方案,它会像这样

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

    【讨论】:

      猜你喜欢
      • 2012-09-17
      • 2019-02-10
      • 1970-01-01
      • 2021-12-08
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      相关资源
      最近更新 更多