2014-04-30 25 views

回答

2

一般技術是首先形成你想要處理的元素列表。你已經有這個列表。然後,您想要將一個或多個轉換應用於輸入列表。在這種情況下,我們不需要進行任何轉換。然後,過濾列表以僅獲取滿足特定條件的元素。最後,您應用組合過濾列表中的元素的操作。

處理名單這是一般的方法是SICP

enumerate -> transform (map) -> filter -> accumulate 

現在所描述的,在這種情況下,我們需要枚舉或地圖任何東西,因爲我們已經有了我們的輸入列表,我之前提到過。

(define (filter predicate sequence) (cond 
    ((null? sequence) '()) 
    (else (cond 
    ((predicate (car sequence)) (cons (car sequence) (filter predicate (cdr sequence)))) 
    (else (filter predicate (cdr sequence))))))) 



(define (accumulate op initial sequence) (cond 
        ((null? sequence) initial) 
        (else (op (car sequence) (accumulate op initial (cdr sequence)))))) 


(define (sum-list list) (accumulate + 0 (filter (lambda(x) (cond ((> x 10) #t) (else #f)))list))) 


(sum-list (list 1 2 3 45 12)) 
;Output: 57 

predicate只是計算結果爲真或假的條件。

2

通過使用filter

(define suma 
    (lambda() 
    (apply + (filter (lambda (e) (> e 10)) lista_de_elemente)))) 

BTW,suma應有的列表作爲參數:

(define suma 
    (lambda(lst) 
    (apply + (filter (lambda (e) (> e 10)) lst)))) 

(suma lista_de_elemente) 
1

添加返回通過過濾掉不大於該數字列表的功能10.將您的返回值傳遞給apply

(define (get-greater-than-ten lst) 

    (define (helper in out) 
    (if (null? in) 
     out 
     (if (> (car in) 10) 
     (helper (cdr in) (append out (list (car in)))) 
     (helper (cdr in) out))) 

    (helper lst `())) 

這樣使用它:

(define suma 
    (lambda() 
     (apply + (get-greater-than-ten lista_de_elemente)))) 
1

如果你想保留一個廣義suma,而不是定義結合了過濾器SUMA,可以改爲定義SUMA,只是總結,然後篩選當你把它作爲一個參數列表:

(define elems (list 2 4 1 12 32 3 34 12)) 

(define (suma lst) 
    (apply + lst)) 

(suma (filter (lambda (x) (> x 10)) elems)) 

現在,你有你的全身sum,並傳遞給它的原始列表THA的只有部分你打算總結。

4

我想你可能要概括它那麼一點點我做filter-sum例如,你可以這樣做:

#!r7rs        ; #!r6rs for r6rs 
(import (scheme)      ; replace scheme with rnrs for r6rs 
     (only (srfi :1) filter fold)) ; remove filter for r6rs 

;; I renamed you list 
(define *lista-de-elemente* '(2 4 8 10 12 14 16)) 

(define (suma) 
    (define (>10? x) 
    (> x 10)) 

    (filter-sum >10? *lista-de-elemente*)) 

(suma) ; ==> 42 

下面是filter-sum一些可能的版本。 我們有直接的遞歸的方式:

(define (filter-sum predicate lst) 
    (cond ((null? lst) 0) 
     ((not (predicate (car lst))) (filter-sum predicate (cdr lst))) 
     (else (+ (car lst) (filter-sum predicate (cdr lst)))))) 

但它不是很好,因爲順序或數字並不重要。我們可以用蓄電池遞歸做到這一點尾巴,這裏有一個名爲let而不是腋過程:

(define (filter-sum predicate lst) 
    (let loop ((lst lst)(acc 0)) 
    (if (null? lst) 
     acc 
     (loop (cdr lst) 
       (if (predicate (car lst)) 
        (+ acc (car lst)) 
        acc))))) 

現在這樣的循環與尾遞歸和蓄能器可以轉換爲摺疊。你會發現均價在SRFI-1 list library

(define (filter-sum predicate lst) 
    (fold (lambda (x acc) 
      (if (predicate x) 
       (+ acc x) 
       acc)) 
     0 
     lst)) 

大部分的代碼現在,如果你要添加或不。隨着filter可以過濾掉,這樣在摺疊的每一個元素可以添加:

(define (filter-sum predicate lst) 
    (fold + 0 (filter predicate lst))) 

filter也是在SRFI-1名單庫。現在,如果你知道你的數字列表超過10就是短..像幾百個,你可以完全改變foldapply,它甚至可能會變得更快一點,但是你對列表的長度做了限制。 (許多方案系統在有限尺寸的堆棧上推送參數,而摺疊會在當時累積列表中的一個元素。)

相關問題