Сумма даже в схеме - PullRequest
       16

Сумма даже в схеме

2 голосов
/ 24 января 2011

Это мой первый опыт со Схемой. У меня есть список целых чисел, и я хочу получить сумму всех четных чисел в списке.

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

Ответы [ 5 ]

8 голосов
/ 24 января 2011
(define (sum_even l)
    (cond ((null? l) 0)
          ((even? (car l)) (+ (car l) (sum_even (cdr l))))
          (else (sum_even (cdr l)))))

Не проверено

4 голосов
/ 24 января 2011

Вы не совсем задаете вопрос. Вы проверяете правильность своего решения или ищете альтернативное решение?

Вы также можете реализовать это следующим образом через

(apply + (filter even? lst))

edit: Если, как вы упомянули, вы не можете использовать фильтр, это решение будет работать и является рекурсивным:

(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)))))
3 голосов
/ 24 января 2011
(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
2 голосов
/ 25 января 2011

Вот еще одна с функциями более высокого порядка и без явной рекурсии:

(use srfi-1)

(define (sum-even ls) (fold + 0 (filter even? ls)))
1 голос
/ 24 января 2011

Рассмотрите возможность использования встроенной функции фильтра.Например:

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