2015-02-17 95 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產生完全相同的結果。減法也是如此。

相關問題