Scheme 为什么“-`参数顺序会导致Racket REPL内存不足?

Scheme 为什么“-`参数顺序会导致Racket REPL内存不足?,scheme,racket,Scheme,Racket,在将参数顺序切换到-函数时,我发现了一个问题 ; source (define (compose f g) (lambda (x) (f (g x)))) (define (repeated f n) (if (= n 1) f (compose f (repeated f (- 1 n))) ; causes an out of memory error (compose f (repeated f (- n 1))) ; runs without issue

在将参数顺序切换到
-
函数时,我发现了一个问题

; source

(define (compose f g) (lambda (x) (f (g x))))

(define (repeated f n)
  (if (= n 1)
    f
    (compose f (repeated f (- 1 n))) ; causes an out of memory error
    (compose f (repeated f (- n 1))) ; runs without issue
))

(define (square n) (* n n))
((repeated square 2) 6) ; 1296


; REPL

> > Racket virtual machine has run out of memory; aborting
Aborted (core dumped)

如果我硬编码值,问题就存在了。此外,如果我使用
+

递增
n
,当您以
n
开始时为
2
,然后调用
(重复f(-1-2))
,则问题不适用
(-12)
-1
,它不等于
1
,因此它继续使用
(重复f(-1-1))
(-1-1)
是2,所以再次调用
(重复f2)
,就达到了一个无限循环

使用其他顺序时,以
(-21)
开始,即
1
,因此递归停止

换句话说:如果你从一个大于
1
的数字开始,然后不断从
n
中减去
1
,那么你最终将到达
1
,递归将停止。如果你从
1
中减去
n
,你将进入一个循环,递归将永远继续(或者直到你的内存用完)


加法不会出现同样的问题,因为加法是可交换的。也就是说,将
x
添加到
y
和将
y
添加到
x
会产生完全相同的结果。减法的情况并非如此。

当您以
n
开始时,即
2
,然后调用
(重复f(-12))
(-12)
-1
,它不等于
1
,因此它继续使用
(重复f(-1-1))
(-1-1)
是2,所以再次调用
(重复f2)
,就达到了一个无限循环

使用其他顺序时,以
(-21)
开始,即
1
,因此递归停止

换句话说:如果你从一个大于
1
的数字开始,然后不断从
n
中减去
1
,那么你最终将到达
1
,递归将停止。如果你从
1
中减去
n
,你将进入一个循环,递归将永远继续(或者直到你的内存用完)

加法不会出现同样的问题,因为加法是可交换的。也就是说,将
x
添加到
y
和将
y
添加到
x
会产生完全相同的结果。减法的情况并非如此