让我们考虑几个案例:
1) (sumOdd 5) 应该返回什么?嗯,它应该返回 5 + 3 + 1 = 9。 2) (sumOdd 6) 应该返回什么?好吧,这也返回 5 + 3 + 1 = 9。
现在,我们可以通过多种方式编写此算法,但这是我决定考虑的一种方式:
我们将编写一个递归函数,从 n 开始,倒计时。如果 n 是奇数,我们想将 n 添加到我们的运行总数中,然后倒数2。为什么我要倒数2?因为如果 n 是奇数,则 n - 2 也是奇数。否则,如果 n 是偶数,我不想添加任何内容。但是,我想确保我继续递归,以便得到一个奇数。如何从偶数倒数到下一个奇数?我减去 1。我这样做,倒计时直到 n <= 0。我不想在我的运行总数中添加任何东西,所以我返回 0。这是该算法的样子:
(define sumOdd
(lambda (n)
(cond ((<= n 0) 0)
((odd? n) (+ n (sumOdd (- n 2))))
(else (sumOdd (- n 1))))))
如果它对您有帮助,这里有一个稍微不同的算法的更明确的例子:
(define sumOdd
(lambda (n)
(cond ((<= n 0) 0)
((odd? n) (+ n (sumOdd (- n 1))))
((even? n) (+ 0 (sumOdd (- n 1))))))) ; note that (even? n) can be replaced by `else' (if its not odd, it is even), and that (+ 0 ..) can also be left out
编辑:
我看到问题已经改变了一点。要将前 N 个正奇数相加,有几个选项。
第一个选项:数学!
(define sumOdd (lambda (n) (* n n)))
第二种选择:递归。有很多方法可以做到这一点。例如,您可以生成 2*n 的列表并使用上述过程。