2013-02-13 248 views
3

我在計劃語法中有點新......我試圖做一個簡單的程序,在其中輸入一個整數,如果整數甚至是做某件事情,如果它奇怪的做別的事情。 我能夠做到這一點。現在,我需要做一個循環,我可以遞減的數量,直到它等於1 這裏是我的代碼:Scheme while while循環

#lang racket 

(define (even? n) 
    (if (eqv? n 0) #t 
     (odd? (- n 1)))) 
(define (odd? n) 
    (if (eqv? n 0) #f 
     (even? (- n 1)))) 

; this is the function that i wanted to be inside the loop 
(define (sequence n) 
(cond 
[(even? n) n(/ n 2)] 
[(odd? n) n(+(* n 3) 1) ]) 

) 
(sequence 5) 

輸出應該是數字的序列。換句話說,它應該在列表中。

回答

1

輸出列表是通過將列表中的每個元素都包含在列表中,然後在輸入上推進遞歸直到輸入耗盡(在您的情況下,當編號爲n是1)時構建的。通過連續收集列表頭部的元素並以空值結束遞歸,會創建一個新的適當列表並在程序執行結束時返回。具體方法如下:

(define (sequence n) 
    (cond [(= n 1)        ; if n=1, it's the exit condition 
     (list n)]       ; return a list with last element 
     [(even? n)       ; if n is even 
     (cons n (sequence (/ n 2)))]   ; cons n and advance the recursion 
     [(odd? n)        ; if n is odd 
     (cons n (sequence (+ (* n 3) 1)))])) ; cons n and advance the recursion 

以上將與Collatz序列返回一個列表給定數n

(sequence 6) 
=> '(6 3 10 5 16 8 4 2 1) 

補充說明:程序even?odd?是標準的方案,你不要不必重新定義它們。

+1

感謝這是完美的,快速 – Muhsag 2013-02-13 22:57:25

+0

請你能解釋在代碼n的哪一部分遞減1,如果我有一個案件,我想增加,而不是。謝謝 – Muhsag 2013-02-13 23:00:34

+0

在Collat​​z序列中,數字不會遞減_by one_。如果n是偶數,那麼我們通過在這部分中將其減半來減少它(/ n 2)。如果n是奇數,那麼我們實際上在這個部分增加它:'(+(* n 3)1)'。注意在這兩種情況下,'n'的修改值作爲參數傳遞給下一個遞歸調用,這就是我們通常在方案 – 2013-02-13 23:03:59