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

List 如何获得所有元素的总和>;10在给定列表中使用chez方案?,list,vector,sum,scheme,chez-scheme,List,Vector,Sum,Scheme,Chez Scheme,如果创建一个chez方案ex,该方案将列表中的所有元素相加 (define lista_de_elemente (list 2 4 1 12 32 3 34 12)) (define suma (lambda() (apply + lista_de_elemente))) 如何仅使元素之和大于10?使用过滤器: (define suma (lambda() (apply + (filter (lambda (e) (> e 10)) lista_de

如果创建一个chez方案ex,该方案将列表中的所有元素相加

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

(define suma
    (lambda()
        (apply + lista_de_elemente)))

如何仅使元素之和大于10?

使用
过滤器

(define suma
  (lambda()
    (apply + (filter (lambda (e) (> e 10)) lista_de_elemente))))
顺便说一句,
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))

现在,您已经得到了广义的
求和
,您只传递了原始列表中要求和的部分。

我想您可能希望对其进行一点广义,因此我制作了
过滤器求和
,这样您就可以执行以下操作:

#!r7rs;#!r6rs代表r6rs
(导入(方案);用R6R的RNR替换方案
(仅(srfi:1)过滤器折叠);拆下r6rs的滤清器
;; 我重新命名了你的名单
(定义*元素列表*'(2 4 8 10 12 14 16))
(定义(suma)
(定义(>10?x)
(>x10))
(筛选和>10?*元素列表*)
(suma);==>42
下面是一些可能版本的
过滤器和
。 我们有直接的递归方法:

(定义(过滤器和谓词lst)
(条件((空?lst)0)
((非(谓词(car lst)))(筛选器和谓词(cdr lst)))
(else(+(car-lst)(过滤器和谓词(cdr-lst‘‘‘‘‘‘‘)’)
但这不是很好,因为顺序或数字并不重要。我们可以使用累加器递归地执行此尾部操作,这里使用命名的
let
而不是腋窝程序:

(定义(过滤器和谓词lst)
(让回路((一回路一回路)(附件0))
(如果(空?lst)
行政协调会
(循环(cdr lst)
(如果(谓词(car lst))
(+acc(车辆lst))
行政协调会(())())
现在,这种带有尾部递归和累加器的循环可以转换为折叠。您可以在以下列表中找到折叠:

(定义(过滤器和谓词lst)
(折叠(λ)(x acc)
(if(谓词x)
(+acc x)
行政协调会)
0
(lst)
现在大部分代码都是您是否应该添加。使用
filter
可以过滤掉折叠中的每个元素:

(定义(过滤器和谓词lst)
(折叠+0(过滤器谓词lst)))

过滤器
也位于SRFI-1列表库中。现在,如果你知道10以上的数字列表很短。。像几百个一样,您可以将
折叠
完全更改为
应用
,甚至可能会变得更快,但您正在限制列表的长度。(许多scheme系统在有限大小的堆栈上推送参数,而折叠将一次累积一个元素的列表。)

一般技术是首先形成要处理的元素列表。您已经有了此列表。然后,您希望对输入列表应用一个或多个转换。在这种情况下,我们不需要进行任何转换。然后,过滤列表以仅获取满足特定条件的元素。最后,应用组合筛选列表中元素的操作

处理列表的一般方法如中所述

现在,在本例中,不需要枚举或映射任何内容,因为我们已经有了我前面提到的输入列表

(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
谓词
只是一个计算结果为true或false的条件

(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