gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:27:07 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com