我正在为一个班级的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))))
答案 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”在“球拍”菜单中。它让我免于悲伤。)