Функция определения схемы

Я пытаюсь придумать способ складывать только положительные целые числа до определенного числа в схеме, и я не могу понять, как это сделать. Я пытался использовать рекурсию.

Это то, что у меня есть до сих пор:

(define sumEven
   (lambda(n)
        (cond((> n 0)1)
             ((even? n) (* (sumEven n (-(* 2 n) 1)

Я думал, что вызов будет делать что-то вроде:

 (sumEven N)=2 + 4 + ... + 2*N

и вывести что-то вроде этого:

(sumEven 1)  ==> 2
(sumEven 4)  ==> 20
(sumEven 5)  ==> 30

но я не уверен, как просто добавить четное целое и пропустить нечетное. Это вообще возможно?


person slim    schedule 16.03.2013    source источник


Ответы (2)


Вы имеете в виду вот так?

(define (sumEven n)
  (if (= n 0)
      0
      (+ (* 2 n) (sumEven (- n 1)))))

(sumEven 1)
(sumEven 4)
(sumEven 5)

2
20
30
person uselpa    schedule 16.03.2013
comment
не знал, что это может быть так просто, может быть, я слишком много думал, спасибо за помощь - person slim; 17.03.2013

Обратите внимание, что вы также можете реализовать процедуру sumEven с помощью хвостовой рекурсии, это имеет преимущество уменьшения требований к пространству стека с линейных, или O(n), до постоянных, или O(1). Это рекомендуемый способ написания рекурсивной процедуры, когда это возможно:

(define sumEven
  (lambda (n)
    (let loop ((n n)
               (acc 0))
      (cond ((zero? n)
             acc)
            (else
             (loop (sub1 n) (+ (* 2 n) acc)))))))

Еще одной альтернативой, соответствующей более функциональному стилю программирования, может быть использование операций со списками и более высокого порядка. заказать функции для создания списка с добавляемыми номерами, а затем добавить их; например так:

(define sumEven
  (lambda (n)
    (apply + (build-list (add1 n) (curry * 2)))))

В любом случае результаты ожидаемы:

(sumEven 1)
=> 2
(sumEven 4)
=> 20
(sumEven 5)
=> 30
person Óscar López    schedule 16.03.2013
comment
спасибо за совет, это поможет мне закончить программу, которую я делаю - person slim; 17.03.2013