方案函数 - 奇数和?

Scheme Function - Odd-Number-Sum?

我正在为 class 开发 Scheme 中的 Racket,问题是创建一个递归函数,显示从 1 开始的 n 个奇数的总和。程序只保留 运行 运行 我不明白为什么。任何帮助将不胜感激。
(即,如果我调用 (odd-sum 2),我希望它计算 1 + 3(前两个奇数)并显示 4)

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

这里是对0到n(含)的数字求和的例子:

(define (sum-from-zero-to n)
  (if (= n 0)
      0
      (+ n (sum-from-zero-to (- n 1)))))

; > (sum-from-zero-to 3) ; 3 + 2 + 1 + 0 = 6
; 6

我们来看偶数求和的问题(然后可以改成奇数求和)

我们需要一个计算第 n 个偶数的助手:

(define (nth-even-number n)
  (* 2 n))

; > (nth-even-number 0)
; 0
; > (nth-even-number 1)
; 2
; > (nth-even-number 2)
; 4

现在偶数求和很简单了(对比sum-from-zero-to

(define (sum-of-even-numbers n)
  (if (= n 0)
      0
      (+ (nth-even-number n)
         (sum-of-even-numbers (- n 1)))))

> (sum-of-even-numbers 3) ; 0 + 2 + 4 + 6 = 12
12

有一个小错误,您放错了括号:

(define (odd-sum-work n)
 (if (= n 1)
      1)
     (+ n (odd-sum-work (- n 2))))

应该是

(define (odd-sum-work n)
 (if (= n 1)
      1
     (+ n (odd-sum-work (- n 2)))))

在 DrRacket 中重新缩进您的代码,显示为

(define (odd-sum-work n)
    (if (= n 1) 
         1)
    (+ n (odd-sum-work (- n 2))))

这使得条件没有 "else" 分支更明显——如果 n 为 1,则 1 被评估但被丢弃,评估继续递归永远不会终止。

("Reindent" 在 "Racket" 菜单中。它让我免于悲伤。)