如果創建桑切斯方案前,這使得所有元素的和從lista_de_elemente如何使用chez方案獲得給定列表中所有元素> 10的總和?
(define lista_de_elemente (list 2 4 1 12 32 3 34 12))
(define suma
(lambda()
(apply + lista_de_elemente)))
如何使只有元素之和大於10?
如果創建桑切斯方案前,這使得所有元素的和從lista_de_elemente如何使用chez方案獲得給定列表中所有元素> 10的總和?
(define lista_de_elemente (list 2 4 1 12 32 3 34 12))
(define suma
(lambda()
(apply + lista_de_elemente)))
如何使只有元素之和大於10?
一般技術是首先形成你想要處理的元素列表。你已經有這個列表。然後,您想要將一個或多個轉換應用於輸入列表。在這種情況下,我們不需要進行任何轉換。然後,過濾列表以僅獲取滿足特定條件的元素。最後,您應用組合過濾列表中的元素的操作。
處理名單這是一般的方法是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
只是計算結果爲真或假的條件。
通過使用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)
添加返回通過過濾掉不大於該數字列表的功能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))))
如果你想保留一個廣義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的只有部分你打算總結。
我想你可能要概括它那麼一點點我做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就是短..像幾百個,你可以完全改變fold
爲apply
,它甚至可能會變得更快一點,但是你對列表的長度做了限制。 (許多方案系統在有限尺寸的堆棧上推送參數,而摺疊會在當時累積列表中的一個元素。)