【问题标题】:multiplying list of items by a certain number 'x'将项目列表乘以某个数字“x”
【发布时间】:2016-10-02 22:40:44
【问题描述】:

您将如何编写一个将列表中的每个元素与给定数字 (x) 相乘的过程。如果我给出一个列表 '(1 2 3) 且 x=3,则该过程应返回 (3 6 9)

我的尝试:

(define (mul-list list x)
(if (null? list)
1
(list(* x (car list))(mul-list (cdr list)))))

上面的代码似乎不起作用。我必须进行哪些更改?请帮忙

提前致谢。

【问题讨论】:

    标签: scheme lisp racket multiplication cdr


    【解决方案1】:

    这是教科书示例,您应该使用map,而不是重新发明轮子:

    (define (mul-list lst x)
      (map (lambda (n) (* x n)) lst))
    

    但我猜你想从头开始实现它。您的代码存在以下问题:

    • 您不应该调用 list 参数,这与同名的内置过程(您当前正在尝试使用的过程)发生冲突!
    • 假设我们正在构建一个列表作为输出,基本情况应该返回一个空列表
    • 我们通过consing 元素构建列表,而不是通过调用list
    • 你忘了将第二个参数传递给mul-list的递归调用

    这应该可以修复所有错误:

    (define (mul-list lst x)
      (if (null? lst)
          '()
          (cons (* x (car lst))
                (mul-list (cdr lst) x))))
    

    无论哪种方式,它都按预期工作:

    (mul-list '(1 2 3) 3)
    => '(3 6 9)
    

    【讨论】:

    • 非常感谢!你能给我推荐一本学习Scheme的初学者书吗:)
    • @mike 当然,很高兴:)。 《The Little Schemer》和《How to Design Programs》非常棒,《Structure and Interpretation of Computer Programs》是有史以来最好的编程书籍之一,虽然它有点高级
    • 非常感谢 :) Óscar López。这是一个不错的清单
    • @ÓscarLópez 我打算通过讨论尾递归来扩展您的答案,并提供另一种编写 map 过程的方法...但是我了解的越多球拍的堆栈,这似乎越不重要。您认为介绍这个主题并演示一些解决方法对我有好处吗?我特别问你是因为我不想浪费其他专家(比如你)的时间,因为我可能不明白你的理解。
    • @naomik 可以显示尾递归版本,但请记住,OP 仍在学习中,这对他来说可能是一个高级主题;)此外,通常会实现 map以非尾递归方式。
    【解决方案2】:

    For 及其扩展(for*、for/list、for/first、for/last、for/sum、for/product、for/and、for/or 等:https://docs.racket-lang.org/reference/for.html)对于循环中的循环非常有用球拍:

    (define (ml2 lst x)
      (for/list ((item lst))
        (* item x)))
    

    测试:

    (ml2 '(1 2 3) 3)
    

    输出:

    '(3 6 9)
    

    我发现在许多情况下,'for' 实现提供了简短、简单且易于理解的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2017-02-09
      • 1970-01-01
      相关资源
      最近更新 更多