2015-02-17 45 views
1

将参数顺序交换到-函数时发生问题。为什么`-`参数顺序会导致Racket REPL内存不足?

; 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,则问题不适用。

回答

4

当您以n开头为2时,您可以拨打(repeated f (- 1 2))(- 1 2)-1,这不等于1,所以它继续(repeated f (- 1 -1))(- 1 -1)是2,因此您再次致电(repeated f 2)并且您已达到无限循环。

当使用另一个订单时,您从(- 2 1)开始,即1,这就是递归停止的地方。

换句话说:如果你开始与一些比1更大和你保持距离n减去1,你最终会到达1和递归将停止。如果你从1减去n,你将进入一个循环,递归将永远持续下去(或者直到你用完内存)。

加法不会发生同样的问题,因为加法是可交换的。这就是将x加到y并且加上yx产生完全相同的结果。减法也是如此。

相关问题