[英]Sum of even in Scheme
这是我第一次使用Scheme。 我有一个整数列表,我想得到列表中所有偶数的总和。
; sum_even
(define (sum_even l)
(if (null? l) l
(cond ((even? (car l)) 0)
((not(even? (car l))) (car l)))
(+ (sum_even (car l) (sum_even(cdr l))))))
(sum_even '(2 3 4))
(define (sum_even l)
(cond ((null? l) 0)
((even? (car l)) (+ (car l) (sum_even (cdr l))))
(else (sum_even (cdr l)))))
没有测试过
你并不是在问一个问题。 您在检查您的解决方案是否正确或正在寻找替代解决方案吗?
您也可以通过以下方式实现它
(apply + (filter even? lst))
编辑:如果,正如您所提到的,您不能使用过滤器,此解决方案将起作用并且是尾递归的:
(define (sum-even lst)
(let loop ((only-evens lst) (sum 0))
(cond
((null? only-evens) sum)
((even? (car only-evens))
(loop (cdr only-evens) (+ (car only-evens) sum)))
(else (loop (cdr only-evens) sum)))))
(define (sum-even xs)
(foldl (lambda (e acc)
(if (even? e)
(+ e acc)
acc))
0
xs))
例:
> (sum-even (list 1 2 3 4 5 6 6))
18
这是另一个具有更高阶函数且没有显式递归的函数:
(use srfi-1)
(define (sum-even ls) (fold + 0 (filter even? ls)))
考虑使用内置过滤器功能。 例如:
(filter even? l)
将返回列表中的偶数列表l。 有很多方法可以对列表中的数字求和(示例来自http://groups.engin.umd.umich.edu/CIS/course.des/cis400/scheme/listsum.htm ):
;
; List Sum
; By Jerry Smith
;
(define (list-sum lst)
(cond
((null? lst)
0)
((pair? (car lst))
(+(list-sum (car lst)) (list-sum (cdr lst))))
(else
(+ (car lst) (list-sum (cdr lst))))))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.