Function 方案函数-奇数和?

Function 方案函数-奇数和?,function,scheme,racket,Function,Scheme,Racket,我正在研究一个类的racketin方案,问题是创建一个递归函数,它显示从1开始的n个奇数的和。这个程序一直在运行,我不明白为什么。任何帮助都将不胜感激。 (即,如果我调用(奇数和2),我希望它计算1+3(前两个奇数)并显示4) 以下是从0到n(含)的数字总和示例: 让我们看看偶数求和的问题(然后你可以把它改为奇数求和) 我们需要一个计算第n个偶数的助手: (define (nth-even-number n) (* 2 n)) ; > (nth-even-number 0) ; 0

我正在研究一个类的racketin方案,问题是创建一个递归函数,它显示从1开始的n个奇数的和。这个程序一直在运行,我不明白为什么。任何帮助都将不胜感激。
(即,如果我调用(奇数和2),我希望它计算1+3(前两个奇数)并显示4)


以下是从0到n(含)的数字总和示例:

让我们看看偶数求和的问题(然后你可以把它改为奇数求和)

我们需要一个计算第n个偶数的助手:

(define (nth-even-number n)
  (* 2 n))

; > (nth-even-number 0)
; 0
; > (nth-even-number 1)
; 2
; > (nth-even-number 2)
; 4
现在对偶数求和很简单(与从零到求和相比)


有一个小错误,你把括号放错了地方:

(define (odd-sum-work n)
 (if (= n 1)
      1)
     (+ n (odd-sum-work (- n 2))))
应该是

(define (odd-sum-work n)
 (if (= n 1)
      1
     (+ n (odd-sum-work (- n 2)))))
在DrRacket中重新标识代码时,它会显示

(define (odd-sum-work n)
    (if (= n 1) 
         1)
    (+ n (odd-sum-work (- n 2))))
更明显的是,条件没有“else”分支-如果
n
为1,则对
1
进行求值,但将其丢弃,求值将以一个永远不会终止的递归继续


(“Reindent”在“Racket”菜单中。它让我免于很多悲伤。)

也许你应该加一个检查,以确保
n
是奇怪的。或者在条件中使用小于或等于。@在我看来,Rptx参数验证实际上不属于帮助函数。更好的办法是在本地将其定义为“public”函数。但是你的回答中没有包含“公共”功能。也许只是一张纸条。OP可能会修复括号,然后仍然会得到无限循环。也许只是加个便条?
(define (odd-sum-work n)
 (if (= n 1)
      1)
     (+ n (odd-sum-work (- n 2))))
(define (odd-sum-work n)
 (if (= n 1)
      1
     (+ n (odd-sum-work (- n 2)))))
(define (odd-sum-work n)
    (if (= n 1) 
         1)
    (+ n (odd-sum-work (- n 2))))