从a到b的所有整数之和,我的代码有什么问题?

时间:2019-02-23 16:14:01

标签: scheme lisp racket r5rs

目标是创建一个代码,该代码将计算从a到b的所有整数之和 如果a> b,则其值应为0。

(define (sum-from-to a b)
  (if (> a b)
      0
      (+ a (sum-from-to (- a 1) b))))

我的问题是,当我运行此命令时,内存不足。我的代码有什么问题?

2 个答案:

答案 0 :(得分:2)

递归步骤不正确。假设word.push_back(puzzle[x++][y]); puzzle[x++][y] = '_'; puzzle[x--][y];的修复是如此简单:

a <= b

考虑一下,我们希望(define (sum-from-to a b) (if (> a b) 0 (+ a (sum-from-to (+ a 1) b)))) ; add 1, don't subtract 在每一步都变得更接近a,直到它越过为止。如果我们减少 b,那么它将离开a,与我们想要的完全相反。这就是为什么您的过程用尽了内存,b从未达到a

答案 1 :(得分:2)

好吧,这是一个数学家会给出的答案:从ab的所有整数之和是从ab的整数之和的一半从ba的所有整数的总和。这就是a + b + a + 1 + b - 1 + ... + b + a,即a + b + a + b + ... + a + b。而这就是(a + b) * (b - a + 1)。因此,最终的总和为(a + b) * (a - b + 1) / 2。因此,只需将其写在Lisp中,并为b < a指定附加条件:

(define (sum-a-b a b)
  (if (> a b)
      0
      (/ (* (+ a b) (+ (- b a) 1)) 2)))

当然,可能要寻找的是递归或迭代答案。这两种方法都是解决该问题的可怕方法:递归答案在时间和空间复杂度方面都是可怕的,而迭代答案在时间复杂度方面仅是可怕的。

教Lisp的人应该停止积极尝试教别人编程不好。