【问题标题】:Lists in scheme方案中的列表
【发布时间】:2009-10-21 00:25:15
【问题描述】:

我正在尝试在方案中编写一个函数,该函数接受一个列表并将列表中的每个项目平方,然后以(list x y z) 的形式返回列表。但是,我不确定如何编写可以做到这一点的代码。到目前为止,我有

(define (square=list list)
  (cond
    [(empty? list) false]
    [else (list (sqr (first a-list))(square-list (rest a-list)))]))

但它以表单形式返回列表

(cons x (cons y (cons z empty)))

我该怎么做才能让它以(list x y z) 的形式返回列表?谢谢!

【问题讨论】:

  • (cons x (cons y (cons z empty))) 是你想要的。你所拥有的是(list x (list y (list z))),它与(cons x (cons (cons y (cons z empty) empty) empty) 相同——conslist 不要做同样的事情。
  • 哎呀,上面有一个我没看到的错误...你实际上拥有的是 (list x (list y (list z))) 这是与 (cons x (cons y (cons z empty) empty) empty) 相同。

标签: list scheme


【解决方案1】:

你快到了——确保你理解conslist之间的区别(教科书How to Design Programs在第13节解释了这一点。你可以找到在线副本here)。

cons 将一个项目作为它的第一个元素,并且(通常)一个(可能为空的)列表作为“其余”部分。例如,(cons 1 empty) 将数字 1 作为其第一个元素,empty 列表作为“其余”。 (cons 1 (cons 2 empty)) 将数字 1 作为第一个元素,(cons 2 empty) 作为“其余”。

list 只是用于制作列表的一种简单的简写方式,可以获取任意数量的项目。因此:

(list 1 2 3 4 5)

与...相同

'(1 2 3 4 5)

相同

(cons 1 (cons 2 (cons 3 (cons 4 (cons 5 empty))))).

但要小心。 (list 1 (list 2 (list 3))) (cons 1 (cons 2 (cons 3 empty))) 相同。其实就是(cons 1 (cons 2 (cons 3 empty) empty) empty)

如果您仍然感到困惑,请随时发表评论。

【讨论】:

    【解决方案2】:

    问题是您在 else 语句中使用了 list 。你是说给我建立一个列表,这个值作为第一个条目,一个列表作为第二个条目。 您想将第一个条目添加到递归调用创建的列表中。

    (list 'a '(b c d))
    ; gives you
    '(a (b c d))
    
    (cons 'a '(b c d))
    ; gives you
    '(a b c d)
    

    【讨论】:

      【解决方案3】:

      这可能不是你的助教想要的,但我还是会把它扔进去,因为它可以帮助你更多地了解 Scheme。写你想要做的事情的惯用(在Scheme中)方式是使用map

      > (map (lambda (x) (* x x)) '(1 2 3 66 102 10403))
      (1 4 9 4356 10404 108222409)
      

      map 将一个函数(此处为(lambda (x) (* x x)) - 一个返回其输入平方的无名函数)应用于列表的每个元素,并返回一个包含所有结果的新列表。 Scheme 的 map 基本上与您在代码中执行的迭代相同,其优点是通过使用 map 您不必显式编写此类迭代(并且,至少名义上,Scheme 实现可能会以某种特殊方式优化 map ,尽管在大多数情况下这并不是那么重要)。关于 map 的重要之处在于它将您的代码简化为重要部分 - 此代码对列表的每个元素进行平方,其他代码取每个元素的平方根,此代码添加一个等等,无需重复相同的基本循环迭代代码一次又一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-16
        • 2015-02-04
        • 2016-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-10
        相关资源
        最近更新 更多