讓我們想想一對夫婦的情況:
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