【问题标题】:Scheme Function - Odd-Number-Sum?方案函数 - 奇数和?
【发布时间】:2015-12-13 07:44:47
【问题描述】:

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

(define (odd-sum n)
 (odd-sum-work (- (* 2 n) 1)))
(define (odd-sum-work n)
 (if (= n 1)
      1)
     (+ n (odd-sum-work (- n 2))))

【问题讨论】:

    标签: function scheme racket


    【解决方案1】:

    这里是从 0 到 n(包括)的数字求和的示例:

    (define (sum-from-zero-to n)
      (if (= n 0)
          0
          (+ n (sum-from-zero-to (- n 1)))))
    
    ; > (sum-from-zero-to 3) ; 3 + 2 + 1 + 0 = 6
    ; 6
    

    我们来看看偶数相加的问题(然后可以改成奇数相加)。

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

    (define (nth-even-number n)
      (* 2 n))
    
    ; > (nth-even-number 0)
    ; 0
    ; > (nth-even-number 1)
    ; 2
    ; > (nth-even-number 2)
    ; 4
    

    现在对偶数求和很简单(与 sum-from-zero-to 相比)

    (define (sum-of-even-numbers n)
      (if (= n 0)
          0
          (+ (nth-even-number n)
             (sum-of-even-numbers (- n 1)))))
    
    > (sum-of-even-numbers 3) ; 0 + 2 + 4 + 6 = 12
    12
    

    【讨论】:

      【解决方案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)))))
      

      在 DrRacket 中重新缩进你的代码,它显示

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

      这使得条件没有“else”分支变得更加明显——如果n 为1,则1 被评估但被丢弃,并且评估以永远不会终止的递归继续。

      (“Reindent”在“球拍”菜单中。它让我免于痛苦。)

      【讨论】:

      • 也许您应该添加检查以确保 n 是奇数。或者在条件句中使用小于或等于。
      • 在我看来,@Rptx 参数验证并不真正属于辅助函数。最好将其在本地定义为“公共”函数。
      • 你在写。但是您没有在答案中包含“公共”功能。也许只是一个注释。 OP 可能会修复括号,但之后仍然会出现无限循环。也许只是添加一个注释?
      猜你喜欢
      • 2013-09-13
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      相关资源
      最近更新 更多