2012-11-13 94 views
0

好了,所以我最近發佈關於計劃創建一個遞歸函數,將產生偶函數從下定義的列表被稱爲一個問題:功能方案

(define list0 (list 'j 'k 'l 'm 'n 'o 'j)) 
(define list1 (list 'a 'b 'c 'd 'e 'f 'g)) 
(define list2 (list 's 't 'u 'v 'w 'x 'y 'z)) 
(define list3 (list 'j 'k 'l 'm 'l 'k 'j)) 
(define list4 (list 'n 'o 'p 'q 'q 'p 'o 'n)) 
(define list5 '((a b) c (d e d) c (a b)) 
(define list6 '((h i) (j k) l (m n))) 
(define list7 (f (a b) c (d e d) (b a) f)) 

這對於我的脣上功能我創造了這個遞歸功能:

(define mylist '(1 2 3 4 5 6 7)) 
(define (evens lst) 
(define (do-evens lst odd) 
    (if (null? lst) 
     lst 
    (if odd 
     (do-evens (cdr lst) #f) 
     (cons (car lst) (do-evens (cdr lst) #t))))) 
     (do-evens lst #t)) 

,但現在我想創建,做這樣一個「oddrev」功能: (oddrev 1日)這應該返回一個新的列表,從1日拍攝的奇數元素形成,但與原來的順序相反。也就是說,如果我鍵入:

(oddrev '(a b c d e f g)) 

這將/應返回: (GECA)

(oddrev (LIST 's 't 'u 'v 'w 'x 'y 'z)) 

這將/應返回: (ywus)

(oddrev '((h i) (j k) l (m n))) 

這將/應該返回:

(l (h i)) 

(oddrev '()) 

這將/應該返回一個空列表等

我想知道,如果有人可以告訴我這是如何可能的樣子。我正在努力學習未來參考的方案,我聽說這是一種很酷的編程語言,但是現在我在路上碰到了一些顛簸。任何幫助新人都將不勝感激。謝謝

回答

0

好吧把它分解成零件,首先得到每一個奇怪的元素。

那麼既然你已經有了這個很好的小函數來獲得evens我們怎麼才能使用它?那麼如果我們要告訴它它真的開始於偶數,那麼我們就說(do-evens lst #f)而不是(do-evens lst #t)。現在我們將得到所有奇怪的元素!爲了清晰起見,或許我們想在這個函數的主體中改變偶數=>奇數(一個簡單的find-substitute會工作得很好)

接下來我們必須將其逆轉。有兩種方法可以通過手動或通過Scheme庫執行此操作。如果你想用手做,我會讓你解決這個挑戰。否則reverse將爲我們完成這項工作。

我會讓你弄清楚如何結合這兩個步驟。這並不難! Happy Scheming

+0

如果您發現我的回答有幫助,請通過我的回答檢查一下綠色支票,這表示問題已解決。 – jozefg