目标是创建一个代码,该代码将计算从a到b的所有整数之和 如果a> b,则其值应为0。
(define (sum-from-to a b)
(if (> a b)
0
(+ a (sum-from-to (- a 1) b))))
我的问题是,当我运行此命令时,内存不足。我的代码有什么问题?
答案 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)
好吧,这是一个数学家会给出的答案:从a
到b
的所有整数之和是从a
到b
的整数之和的一半从b
到a
的所有整数的总和。这就是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的人应该停止积极尝试教别人编程不好。