Recursion Can';I don’我似乎无法使这个函数按计划工作

Recursion Can';I don’我似乎无法使这个函数按计划工作,recursion,scheme,Recursion,Scheme,以下是我迄今为止所做的工作: (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 这就是我

以下是我迄今为止所做的工作:

(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) (sumOdd 5)应该返回什么?它应该返回5+3+1=9。 2) (sumOdd 6)应该返回什么?这也会返回5+3+1=9

现在,我们可以用很多方法编写这个算法,但我决定用一种方法来考虑:


我们要写一个递归函数,从n开始,倒计时。如果n是奇数,我们希望将n添加到我们的跑步总数中,然后按2倒计时。为什么我要倒数2?因为如果n是奇数,那么n-2也是奇数。否则,如果n是偶数,我不想添加任何内容。但是,我想确保我保持递归,这样我就得到了一个奇数。我如何从偶数倒计时到下一个奇数?我减去1。我这样做,倒计时,直到n来进一步阐述
和赔率
问题,你可以用更抽象的过程来解决它,结合起来,积累期望的答案。这不一定是最简单的解决方案,但很有趣,它捕获了一些在处理列表结构时常见的更一般的模式:

; 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

希望这个答案有趣且不太令人困惑。

您需要有两个变量,一个用于保存尚需添加的奇数的计数器,另一个用于保存当前奇数,该奇数在添加使用后增量为2:

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

下面是一个很好的尾部递归实现:

 (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))))))

甚至更短的尾部递归版本:

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

你的括号不平衡。感谢你花时间回答这个问题,实际上帮助我解决了另一个问题
(define (sum-odd n)
  (define (proc current start)
    (if (= current 0) 
        0
        (+ start (proc (- current 1) (+ start 2)) )))
    (proc n 1))
 (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))))))
(define (sumOdd n)
  (let loop ((sum 0) (n n) (val 1))
    (if (= n 0)
        sum
        (loop (+ sum val) (- n 1) (+ val 2)))))