【问题标题】:Scheme Lisp program for the sum of n even numbers用于 n 个偶数之和的 Scheme Lisp 程序
【发布时间】:2018-02-01 18:42:44
【问题描述】:

我需要创建一个函数来计算从 0 开始的前 n 个偶数之和(即(even-sum 4) 将返回 12)。

  (define (even-sum n)
    (cond
      ((= n 0) 0)
      ((= n 1) 0)
      (else (+ (* n 2) (even-sum (- n 2 ))))))

这是我到目前为止所拥有的,它适用于(even-sum 4),但不适用于其他情况,(even-sum 6) 应该是 30 但出来是 24,(even-sum 2) 应该是 2 但出来是 4。

【问题讨论】:

  • 为什么要在递归中减去 2?
  • (define (even-sum n) (* n (- n 1)))
  • Lisp、Scheme 和 Racket 是三种不同的语言。请不要标记炸弹。

标签: numbers scheme lisp racket r5rs


【解决方案1】:

您可以通过应用此公式计算等差数列的前 n 个数字的总和(请参阅Wikipedia):

(define (arithmetic-series step n)
  (let ((an (+ 2 (* step (- n 1)))))
    (/ (* (+ 2 an) n) 2)))

(arithmetic-series 2 20)
=> 420

但是,如果将d 替换为 2,则公式会更简单。

(编辑:参见 Will Ness 的 comment

【讨论】:

  • 遗憾的是,几乎可以肯定的是,教师所追求的恰恰是数学家花费大量工作证明您可以用这种优雅的封闭形式解决方案替代的蹩脚的迭代解决方案。尽管如此,这当然是正确的答案
  • @tfb 恕我直言,对于家庭作业问题的最佳答案是教师不希望看到的:学生不能简单地复制粘贴它,甚至可能学到一两件事。
  • 在 comp.lang.lisp 的日子里,我在回答此类家庭作业问题方面有一定程度的专业化。 '好的,问题是在寻找一个递归函数,让我们使用 Y 组合器构建一个答案......'
  • 这当然是一个半开玩笑的评论......练习的重点是让学生熟悉列表操作和递归;练习没有经过深思熟虑不是他们的错。我想知道如果他们发现那个代码会有什么反应。 :)
【解决方案2】:

您应该只在递归步骤中减去1

n乘以2时需要减去1。前4个偶数是0, 2, 4, 6,所以要得到6,你需要(* (- 4 1) 2)

(define (even-sum n)
  (cond
   ((= n 0) 0)
   ((= n 1) 0)
   (else (+ (* (- n 1) 2) (even-sum (- n 1))))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多