2017-10-09 63 views
-1

我剛剛進入編碼領域,對Dr.Retet感興趣,現在我面臨着我的第一個問題。我創建了這個代碼:Dr. Racket:保存中間結果 - Collat​​z猜想

(define (collatz n) 
    (cond ((= n 1) 1) 
     ((> n 1) (collatz_helper n)))) 

(define (collatz_helper n) 
    (if (even? n) 
     (collatz (/ n 2)) 
     (collatz (+ (* 3 n) 1)))) 


(collatz 100) ;; >1 

是否有可能將所有中間結果存儲在列表中或打印出來。我的意思是通過中間結果n/2或3n + 1直到我們得到1.

例如n = 100(100,50,25,76,38,19,58,29,88,44,22,11 ,34,17,52,26,13,40,20,10,5,16,8,4,2,1)

有人可以給我一個線索或告訴我如何實現這樣的事情嗎?

+0

您對調試輸出感興趣嗎?或者你想使用中間結果做些什麼? –

+0

我想使用中間結果的東西。但首先,我想了解您如何存儲它們,然後「打印」它們。我的意思是:我想知道程序完成了哪些步驟才能達到1.例如,對於n = 100,輸出應該是(100,50,25,76,38,19,58,29,88 ,44,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1)作爲列表或東西。 – herbrand

+0

出於調試目的,您可以使用'display'。爲了保持結果,您需要隨時建立一個列表。 –

回答

1

首先,你可以合併你的兩個功能於一體,採用cond檢查所有三種情況:每個遞歸步驟

(define (collatz n) 
    (cond 
    ((= n 1) 1) 
    ((even? n) 
    (collatz (/ n 2))) 
    (else 
    (collatz (+ (* 3 n) 1))))) 

然後,建立中間值的列表,你可以利弊n,創建列表,其第一個元素是原始n和最後一個元素是1(假設它終止):

(define (collatz n) 
    (cond 
    ((= n 1) '(1)) 
    ((even? n) 
    (cons n (collatz (/ n 2)))) 
    (else 
    (cons n (collatz (+ (* 3 n) 1)))))) 

例如,

(collatz 100) 
=> '(100 50 25 76 38 19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1)