1

您将如何编写一个将列表中的每个元素与给定数字 (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)))))

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

提前致谢。

4

2 回答 2

2

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

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

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

  • 您不应该调用list与同名的内置过程冲突的参数 - 您当前正在尝试使用的过程!
  • 假设我们正在构建一个列表作为输出,基本情况应该返回一个空列表
  • cons我们通过ing 元素来构建列表,而不是通过调用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)
于 2016-10-02T23:49:15.560 回答
0

For 及其扩展(for*、for/list、for/first、for/last、for/sum、for/product、for/and、for/or 等: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)

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

于 2016-10-04T11:34:31.107 回答