方案中的偶数总和

发布于 2024-10-14 07:52:23 字数 259 浏览 0 评论 0原文

这是我第一次接触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))

This is my first experience with Scheme. I have a list with integers and I wanna get the sum of all even number in list.

 ; 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))

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

烛影斜 2024-10-21 07:52:23
(define (sum_even l)
    (cond ((null? l) 0)
          ((even? (car l)) (+ (car l) (sum_even (cdr l))))
          (else (sum_even (cdr l)))))

未测试

(define (sum_even l)
    (cond ((null? l) 0)
          ((even? (car l)) (+ (car l) (sum_even (cdr l))))
          (else (sum_even (cdr l)))))

Not tested

浪菊怪哟 2024-10-21 07:52:23

你并不是在问一个问题。您是否正在检查您的解决方案是否正确或正在寻找替代解决方案?

您还可以通过编辑实现它,如下所示

(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)))))

You're not exactly asking a question. Are you checking if your solution is correct or looking for an alternate solution?

You can also implement it as follows via

(apply + (filter even? lst))

edit: If, as you mentioned, you can't use filter, this solution will work and is tail-recursive:

(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)))))
苍暮颜 2024-10-21 07:52:23
(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
(define (sum-even xs)
  (foldl (lambda (e acc) 
           (if (even? e) 
               (+ e acc) 
               acc))
         0 
         xs))

Example:

> (sum-even (list 1 2 3 4 5 6 6))
18
瞄了个咪的 2024-10-21 07:52:23

这是另一个具有高阶函数并且没有显式递归的函数:

(use srfi-1)

(define (sum-even ls) (fold + 0 (filter even? ls)))

Here is another one with higher order functions and no explicit recursion:

(use srfi-1)

(define (sum-even ls) (fold + 0 (filter even? ls)))
怎会甘心 2024-10-21 07:52:23

考虑使用内置过滤器功能。例如:

(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))))))

Consider using the built-in filter function. For example:

(filter even? l)

will return a list of even numbers in the list l. There are lots of ways to sum numbers in a list (example taken from 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))))))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文