如何使用Racket计算从1到n的函数的总和?

时间:2019-04-03 03:11:19

标签: racket

总和(2x-1,x = 1 ... n)。我必须编写一个递归函数来求和。

(define (sum1 n)
  (if (= n 0)
      -1
      (+ n (- 1 (sum1 (* n 1))))))

这是我到目前为止所拥有的,我很迷茫。

2 个答案:

答案 0 :(得分:1)

您的基本案例是1而不是0,因为您只是在 1 n中对其进行定义。因此,仅在N上定义函数。因此,我们不需要考虑函数的0情况(它仅消耗N s)。

此外,递归调用应将n applied 添加到2x-1中,以添加其余序列的总和。当前,该函数不会终止,因为您正在同一输入(* n 1) = n上调用它。 (sum1 n) => (sum1 n) => ...

#lang racket

(require rackunit)

;; N is one of:
;; - 1
;; - (+ 1 N)
;; interpretation: 1, 2, 3 ...

;; N -> Number
;; sums `(- (* 2 x) 1)` from 1 to n
(define (sum1 n)
  (if (= n 1)
      (- (* 2 1) 1) ;; = 1
      (+ (- (* 2 n) 1) (sum1 (- n 1)))))

(check-equal? (sum1 1) 1)
(check-equal? (sum1 10) 100)

抽象函数:

;; [Number -> Number] N -> Number
;; sums of f from 1 to n
(define (summation f n)
  (if (= n 1)
      (f 1)
      (+ (f n) (summation f (- n 1)))))

(check-equal? (summation identity 5) (+ 1 2 3 4 5))
(check-equal? (summation sqr 3) (+ (sqr 1) (sqr 2) (sqr 3)))

(check-equal? (summation (λ (x) (- (* 2 x) 1)) 1) 1)
(check-equal? (summation (λ (x) (- (* 2 x) 1)) 10) 100)

答案 1 :(得分:0)

如果您只想输出总和,这就是我的方法:


#lang racket

(define (sum n)
  (if (= n 1)
     1
     (+ (-(* 2 n) 1) (sum (- n 1)))))