如果创建一个 chez 方案 ex,对 lista_de_elemente 中的所有元素进行求和
(define lista_de_elemente (list 2 4 1 12 32 3 34 12))
(define suma
(lambda()
(apply + lista_de_elemente)))
如何使元素之和大于 10?
最佳答案
我想你可能想概括一下它,所以我做了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
而不是 axillary 过程:
(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
,它甚至可能会变得更快一点,但是您正在对列表的长度进行限制。 (许多方案系统将参数推送到有限大小的堆栈上,而折叠一次会累积列表一个元素。)
关于list - 如何使用 chez 方案获得给定列表中所有元素 >10 的总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23380385/