Scheme函数 - Odd-Number-Sum?

时间:2015-09-16 15:55:13

标签: function scheme racket

我正在为一个班级的Scheme中的Racket工作,问题是创建一个递归函数,显示从1开始的n个奇数的总和。程序只是保持运行和运行,我可以'明白为什么。任何帮助将不胜感激 (即如果我打电话(奇数和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))))

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

有一个小错误,你错误地放了你的括号:

(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”在“球拍”菜单中。它让我免于悲伤。)