将项目列表乘以特定数字'x'

时间:2016-10-02 22:40:45

标签: scheme lisp racket multiplying cdr

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

我的尝试:

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

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

  • 您不应该致电list一个与同名内置程序冲突的参数 - 您当前正在尝试使用的参数!
  • 基础案例应该返回一个空列表,因为我们正在建立一个列表作为输出
  • 我们按cons元素构建列表,而不是通过调用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)

答案 1 :(得分:0)

For及其扩展名(for *,for / list,for / first,for / last,for / sum,for / product,for / and,for / or etc:https://docs.racket-lang.org/reference/for.html)非常有用在Racket中循环:

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

测试:

(ml2 '(1 2 3) 3)

输出:

'(3 6 9)

我发现在很多情况下,&#39;对于&#39;实现提供简短,易于理解的代码。