2013-12-09 69 views
0

問題: 設計一個函數,該函數使用一個數字列表並生成列表中每個其他數字的列表 。所以dr racket accumulator幫助瞭解

(skip1 (list 1 4 2 6 9 5)) produces (list 1 2 9) 

(define (skip1 lon0) 

(local [(define (skip1 lon i) 
     (cond [(empty? lon) empty] 
       [else 
       (if (odd? i) 
        (cons (first lon) 
         (skip1 (rest lon) (add1 i))) 
        (skip1 (rest lon) (add1 i)))]))] 
(skip1 lon0 1))) 

任何人都可以解釋它的功能後,是如何工作的,如果

回答

1

哈哈,我知道這是來自課程。你去UBC吧?無論如何...

i是一個累加器,可以跟蹤列表中的位置。蹦牀通話從整個名單開始,所以初始位置只是1。在您進行第一次遞歸調用後,第一個元素將被剝離,所以新的起始位置是2。這一直進行到您到達列表末尾(例如n元素),此時in

所以,你想要一個函數,只保留在奇數位置的數字,所以你想丟棄那些不是在一個奇怪的位置。 (odd? i)然後告訴您lon的第一個元素是否在初始列表中的奇數位置。如果這個元素處於奇怪的位置,我們保留該元素,並將其列入遞歸調用列表的其餘部分,否則我們丟棄該項目,然後轉到遞歸調用。

嘗試單步執行示例。 if部分就是關於在最終結果中保留或不保留lon的第一個元素的選擇。

+0

對於這些累加器,每次遞歸調用完成後,第一個元素將關閉,直到它們全部消失爲止?喜歡適用於所有的東西 – statstudent

+0

在說出這種情況之前,我會小心謹慎,但情況往往如此。我認爲你的問題更多地是關於遞歸:列表中的所有遞歸函數都會在第一個元素上(遞歸地)操作,直到列表爲空。 – Alec

+0

好的謝謝,是的,我在ubc .... gg – statstudent