【问题标题】:Scheme / Simple Recursion Questions方案/简单递归问题
【发布时间】:2012-03-27 19:59:43
【问题描述】:

Concrete Abstractions中有这个递归的例子:

(define subtract-the-first (lambda (n)
                             (if (= n 0) 0
                                 (- (subtract-the-first (- n 1)) n))))

这个我明白。例如,如果 n = 3,则此函数的计算结果为: (- (+ (+ (+ 1) 2) 3)) -> -6

但是,在后续示例之一中,应该解释为什么无法切换操作顺序。例如,让我们看一下:

(define subtract-the-first2 (lambda (n)
                             (if (= n 0) 0
                                 (- n (subtract-the-first2 (- n 1))))))

如果我调用 (subtract-the-first2 4),结果是 2。但是,我不太了解评估。显然,我在这里犯了一个错误,因为看到这个: (- 4 (+ 3 (+ 2 (+ 1))) ),等于 (- 4 6),因此计算结果为 -2。

感谢任何指点,因为我已经把我的头撞到墙上半小时左右了......

谢谢!

【问题讨论】:

    标签: scheme


    【解决方案1】:

    你可以通过添加一些semiquotes和unquotes来检查这个函数的评估:

    (define subtract-the-first2 (lambda (n)
                                  (if (= n 0) 0
                                    `(- ,n ,(subtract-the-first2 (- n 1))))))
    

    然后评估:

    > (subtract-the-first2 4)
    (- 4 (- 3 (- 2 (- 1 0))))
    

    计算结果为2。 (我看不出你的优点...)

    【讨论】:

    • 非常感谢!我对评估做了一些错误的假设,但现在一切都清楚了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    相关资源
    最近更新 更多