list - 如何使用 chez 方案获得给定列表中所有元素 >10 的总和?

标签 list vector sum scheme chez-scheme

如果创建一个 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/

相关文章:

python - .extend() 方法返回 'None' 而不是我打算返回的所需列表组合

list - 过滤我自己类型的列表 - 元组?

c++ - C++基于成员函数从 vector 中删除对象

c - 对数组与随机值求和

python - 如何对数值字典列表进行排序?

list - 如何在 Go 中打印列表的值

android - 在android中使用矢量路径和XML绘制三角形

c++ - 带有 odeint 的简单二维系统(使用数组)无法编译

sql - 使用 SQL 计算百分比

Excel:如何创建尊重一列的唯一元素列表?