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
会产生完全相同的结果。减法的情况并非如此