方案函数 - 奇数和?
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" 菜单中。它让我免于悲伤。)
我正在为 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" 菜单中。它让我免于悲伤。)