2013-03-01 65 views
-1

這裏工作是我迄今所做的:似乎無法得到這個功能在方案

(define sumOdd 
    (lambda(n) 
     (cond((> n 0)1) 
      ((odd? n) (* (sumOdd n (-(* 2 n) 1) 

輸出會是這個樣子:

(sumOdd 1) ==> 1 
(sumOdd 4) ==> 1 + 3 + 5 + 7 ==> 16 
(sumOdd 5) ==> 1 + 3 + 5 + 7 + 9 ==> 25 

這就是我試圖做到這一點:找到前N個奇數正整數的總和

我想不出只能添加奇數的方法。

+1

你的括號不平衡。 – Necto 2013-03-01 13:51:51

回答

1

讓我們想想一對夫婦的情況:

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列表並使用上述過程。

+0

+1數學版 – uselpa 2013-03-01 19:16:15

1

若要進一步詳細說明sum-odds問題,可以用更抽象的程序來解決問題,這些程序會結合在一起以累積所需的答案。這不一定是最簡單的解決,但它是有趣並捕捉一些處理列表的結構時是常見的更普遍的模式:

; the list of integers from n to m 
(define (make-numbers n m) 
    (if (= n m) (list n)        ; the sequence m..m is (m) 
     (cons n          ; accumulate n to 
      (make-numbers (+ n 1) m))))   ; the sequence n+1..m 

; the list of items satisfying predicate 
(define (filter pred lst) 
    (if (null? lst) '()        ; nothing filtered is nothing 
     (if (pred (car lst))       ; (car lst) is satisfactory 
      (cons (car lst)       ; accumulate item (car lst) 
       (filter pred (cdr lst)))   ; to the filtering of rest 
      (filter pred (cdr lst)))))    ; skip item (car lst) 

; the result of combining list items with procedure 
(define (build-value proc base lst) 
    (if (null? lst) base        ; building nothing is the base 
     (proc (car lst)        ; apply procedure to (car lst) 
      (build-value proc base (cdr lst))))) ; and to the building of rest 

; the sum of n first odds 
(define (sum-odds n) 
    (if (negative? n) #f        ; negatives aren't defined 
     (build-value +        ; build values with + 
        0        ; build with 0 in base case 
        (filter odd?     ; filter out even numbers 
          (make-numbers 1 n))))) ; make numbers 1..n 

希望這回答很有趣,不是太混亂。

+1

感謝您花時間回答這個問題,實際上幫助我解決了另一個問題 – JimTom 2013-03-01 15:17:18

0

你需要有2個變量,其中一個保留的許多奇數如何仍有待添加計數器和另一個持有其得到由2除了使用後增加當前奇數:

(define (sum-odd n) 
    (define (proc current start) 
    (if (= current 0) 
     0 
     (+ start (proc (- current 1) (+ start 2))))) 
    (proc n 1)) 
0

這裏是一個不錯的尾遞歸執行:

(define (sumOdd n) 
    (let summing ((total 0) (count 0) (next 1)) 
    (cond ((= count n) total) 
      ((odd? next) (summing (+ total next) 
           (+ count 1) 
           (+ next 1))) 
      (else (summing total count (+ next 1)))))) 
0

甚至更​​短的尾遞歸版本:

(define (sumOdd n) 
    (let loop ((sum 0) (n n) (val 1)) 
    (if (= n 0) 
     sum 
     (loop (+ sum val) (- n 1) (+ val 2)))))