2013-08-03 53 views
3

我是Scheme新手,這是我第一個功能性語言。遞歸地實現幾乎所有東西似乎對我來說都很尷尬。然而,能夠實現具有單個整數輸入的因子和斐波納契問題的函數。遞歸函數接受方案中的列表

但是,當你的函數有一個列表輸入時呢?假設這個練習:

功能:ret10 - 提取並返回一個列表中的所有號碼大於10 了在給定的列表中找到,詭詐>(ret10「(XE(HN)1月23日12點)) OUTPUT:(23 12)

我應該有(定義C(名單))作爲我的功能在這個論點?或者還有其他方法嗎?

請幫忙。謝謝!


這裏的基於SIR奧斯卡·洛佩斯的回答我的派生的解決方案如下..希望這可以幫助別人:

(define (ret10 lst) 
    (cond 
     ((null? lst) '()) 

     ((and (number? (car lst)) (> (car lst) 10)) 
      (cons (car lst) 
      (ret10 (cdr lst)))) 

     (else (ret10 (cdr lst))) 
    ) 
) 
+0

哎呀。我的意思是大於10。很抱歉。編輯它。 –

回答

4

這樣的問題,你收到的列表作爲輸入,並返回另一個列表作爲輸出有一個衆所周知的解決方案模板。我首先建議你看看The Little SchemerHow to Design Programs,任何一本書都會教會你開始思考解決方案的正確方法。

首先,我會告訴你如何解決一個類似的問題:複製一個列表,就像它來的一樣。這將演示解決方案的一般結構:

(define (copy lst) 
    (cond ((null? lst)    ; if the input list is empty 
     '())      ; then return the empty list 
     (else      ; otherwise create a new list 
     (cons (car lst)   ; `cons` the first element 
       (copy (cdr lst)))))) ; and advance recursion over rest of list 

現在讓我們來看看以上問題與您的問題有何關係。顯然,遞歸的基本情況將是相同的。和以往不同的是,我們cons的第一個元素與列表僅的其餘部分,如果它是一個數字(提示:使用number?程序)它比10更大。如果條件不成立,我們只是推進遞歸,而不考慮任何事情。這裏的總體思路,填充了空白:

(define (ret10 lst) 
    (cond (<???> <???>)   ; base case: empty list 
     (<???>     ; if the condition holds 
     (cons <???>   ; `cons` first element 
       (ret10 <???>))) ; and advance recursion 
     (else     ; otherwise 
     (ret10 <???>))))  ; simply advance recursion 

不要忘了測試:

(ret10 '(x e (h n) 1 23 12 o)) 
=> '(23 12) 

最後要注意:通常你會使用filter方法解決這個問題 - 它將輸入列表作爲輸出並返回另一個列表,僅列出滿足給定謂詞的元素。學習並理解如何編寫解決方案後,請看filter並使用它編寫解決方案,以便比較不同的方法。

+1

Whoooaaa !!!謝謝奧斯卡爵士!你是最好的。感謝讓我自己發現代碼,而不是立即破壞答案。呵呵。我更新了我的文章,以承擔我所提出的解決方案。我希望它能幫助別人! –

+0

@BurnzZ永遠是我的榮幸:) –

0

解決列表中第一個元素的問題,並在列表的其餘部分解決問題。確保您處理終止條件(名單null?)和與結果相結合(在下面consappend

(define (extract pred? list) 
    (if (null? list) 
     '() 
     (let ((head (car list)) 
      (rest (cdr list))) 
     (cond ((pred? head) (cons head (extract pred? rest))) 
       ((list? head) (append (extract pred? head) 
            (extract pred? rest))) 
       (else (extract pred? rest)))))) 

(define (ret10 list) 
    (extract (lambda (x) (and (number? x) (> x 10))) list)) 

> (ret10 '(0 11 (12 2) 13 3)) 
(11 12 13)