递归函数计算从1到n的所有数字的总和?

时间:2017-01-08 01:04:25

标签: scheme racket

我试图解决的问题:

(define my-sum
(lambda (x)
  (+ x (- x 1))))

我已经定义了一般函数...我知道如何在没有递归的情况下在C ++中执行此操作。但我很难决定如何使用Scheme来解决这个问题。

到目前为止我得到了什么:

{{1}}

4 个答案:

答案 0 :(得分:2)

这是一个纯粹的递归解决方案:

(define (my-sum x)
  (if (zero? x)
      0
      (+ x (my-sum (- x 1)))))

不幸的是,这不是尾递归。这是一个尾递归的版本:

(define (my-sum x sum)
  (if (zero? x)
      sum
      (my-sum (- x 1) (+ x sum))))

您可以这样称呼它:

(my-sum x 0)

此处,sum是累加器。

你的第二个答案做了同样的事情,使用尾递归的内部辅助函数,在初始调用内部辅助函数时为累加器提供初始值。

答案 1 :(得分:1)

(define (my-sum n)
  (define (my-sum-helper n m)
     (if (= 0 n)
        m
        (my-sum-helper (- n 1) (+ n m))))
  (my-sum-helper n 0))

答案 2 :(得分:1)

练习是使用递归函数将数字从1加到n。

这是SICP一书中的练习。可以从许多来源获得练习的解决方案。在这种情况下,“比尔蜥蜴”给出了一个非常好的解释:

http://www.billthelizard.com/2010/04/sicp-exercise-130-iterative-sums.html

请注意,在“真正的”球拍中,人们只会写:

(for/sum ([x (in-range 1 (+ n 1))])   ; let x run through 1, 2, ... n
   x)                                 ; add x to the running sum

答案 3 :(得分:0)

也可以在这里使用'named let'来实现一个易于理解的函数,该函数可以立即定义和应用递归:

(define (mysum n)
  (let loop ((m 0)
             (s 0))
    (cond
      [(> m n) s]
      [else (loop (add1 m) 
                  (+ s m))])))

此处可以省略关键字'else'。使用'if'的代码也可以在这里使用而不是'cond',因为只有2个条件。