让我们想想一对夫妇的情况:
1)应该采取什么(sumOdd 5)返回?那么,它应该返回5 + 3 + 1 = 9. 2)应该(sumOdd 6)返回什么?嗯,这也将返回5 + 3 + 1 = 9
现在,我们可以写这个算法了很多办法,但这里有一个方法我已经决定要想一想:
我们要去编写一个递归函数,从n开始,然后倒计时。如果n是奇数,我们希望将n加到我们的运行总数中,然后通过倒计数。为什么我倒数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列表并使用上述过程。
你的括号不平衡。 – Necto 2013-03-01 13:51:51