【问题标题】:Scheme: reverse is not taking any affect方案:反向没有任何影响
【发布时间】:2013-04-09 14:47:12
【问题描述】:
(define key
  (lambda (w)
    (reverse w)
    (if (null? w)
     0
    (let ((k 33))
         (+ (* (ctv(car w)) k) (key (cdr w)))
))))

输出与此相同的内容:

(define key
  (lambda (w)
    (if (null? w)
     0
    (let ((k 33))
         (+ (* (ctv(car w)) k) (key (cdr w)))
))))

为什么我的单词没有反转然后计算?

输入:(key '(x y z))

输出:2475(两种方法)

我不明白为什么会这样。有人请帮我看看为什么会发生这种情况。

【问题讨论】:

    标签: recursion scheme reverse let


    【解决方案1】:

    reverse 只返回反转的列表,而不是将其反转到位。你需要

    (let ((w (reverse w)))
      ...)
    

    得到你想要的效果。

    【讨论】:

    • 它输出相同的东西。 :(
    • 建议:您的代码现在是(define key (lambda (w) (reverse w) your-other-code))。将其更改为(define key (lambda (w) (let ((w (reverse w))) your-other-code)))
    • 它做了一些有趣的事情:它将列表“(x y z)”“反转”为“(y x z)”
    【解决方案2】:

    正如已经指出的那样,reverse 过程返回一个 new 列表,它不会就地修改作为参数传递的列表(所有修改的过程都会发生这种情况列表,小心它)。这就是代码中(reverse w) 行没有任何效果的原因:它肯定会返回一个新的反向列表,但您忽略了返回的值!

    为了使用反向列表,您必须将其存储或传递到某个地方,一个好主意是将其保存在let 表单内定义的局部变量中,并从那时起引用该变量。这就是@michaelb958 的建议:

    (define key
      (lambda (w)
        (let ((w (reverse w)))
          (if (null? w)
              0
              (let ((k 33))
                (+ (* (ctv (car w)) k) (key (cdr w))))))))
    

    但是,请注意,上述将反转w 列表每次在遍历列表时调用递归,我认为这不是您想要的!如果您只需要一次反转列表,请调用reverse之前调用key,并且永远不要调用reverseinside key:

    (key (reverse '(x y z)))
    

    【讨论】:

    • 你会怎么做?我在哪里可以调用 reverse 所以我只调用一次?
    • 哦!也许在我的主要方法中!
    • @SolBethanyReaves 没错,这是最好的地方。绝对 notkey 中,否则每次调用递归时,您都会反转,重新反转,重新反转列表......你明白了;)
    • 非常感谢!!我一直在思考如何做到这一点几个小时。 XD
    【解决方案3】:

    正如其他人所指出的那样,reverse 不会原地反转,因此您的代码应修改为:

    (define key
      (lambda (w)
        (set! w (reverse w))                ; CHANGE IS HERE
        (if (null? w)
             0
             (let ((k 33))
               (+ (* (ctv (car w)) k)
                  (key (cdr w)))))))
    

    请注意,您正在递归调用key,因此您将一次又一次地来回颠倒。

    【讨论】:

      猜你喜欢
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 2020-01-09
      • 1970-01-01
      相关资源
      最近更新 更多