Scheme 方案/简单递归问题

Scheme 方案/简单递归问题,scheme,Scheme,在具体的抽象中,有一个递归的例子: (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-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))))))
如果我调用(减去前2个4),结果是2。然而,我不太理解这个评价。显然,我在这里犯了一个错误,因为你看:
(-4(+3(+2(+1)))
,它等于
(-46)
,因此计算结果为-2

我很感激任何指点,因为我已经把头撞在墙上半个小时左右了


谢谢大家!

您可以通过添加一些
semiquote
s和
unquote
s来检查此函数的计算:

(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
。(我不知道你从哪里得到这些好处……

非常感谢!我对评估做了一些错误的假设,但现在一切都清楚了。