2014-04-07 79 views
0

我正在選擇方案來學習遞歸,我發現它對我非常好:D但是現在,我有一個問題。我如何做一個叫做thirds的函數來選擇一個元素並跳過2並重復這個過程。因此,它返回從第一個元素一個新的列表,每個三重元素例如(thirds '(a b c d e f g h))的應該返回 (a d g)使用計劃遞歸創建一個新列表

(DEFINE (thirds lst) 
(COND 
    ((NOT(list? lst)) (newline) "USAGE: (thirds [list])") 
    ((NULL? lst) lst) 
    ((NULL? (CDR lst)) (CAR lst)) 
    (ELSE (CONS (CAR lst) (thirds (CDR(CDR(CDR lst)))))))) 

這就是我的代碼都試過,但沒有任何真正的運氣.. 任何幫助嗎?

+0

你錯過了一個基本案例。如果你列出的是兩個元素長什麼? – WorBlux

+0

這個問題已經被回答了幾次__最後幾天,[這裏](http://stackoverflow.com/a/22827083/201359)是我自己的嘗試。我想你們都在走相同的路線... –

回答

0

還有另一種方法來做到這一點,即創建一個輔助函數並傳遞索引。

(define (thirds L) 
(thirds-helper L 0)) 

(define (thirds-helper L i) 
(cond ((null? L) '()) 
     ((= 0 (modulo i 3)) 
     (cons (car L) 
       (thirds-helper (cdr L) (+ i 1)))) 
     (else (thirds-helper (cdr L) (+ i 1))))) 

爲讀者練習。你可以修改這個來挑選列表中任何給定的第n個值嗎?