summaryrefslogtreecommitdiff
path: root/lisp/calc/calc-comb.el
diff options
context:
space:
mode:
authormichael schuldt <mbschuldt@gmail.com>2017-04-18 11:24:37 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2017-04-18 11:25:13 -0700
commitd831312d668fbedeffe3711b13cd455309da84a1 (patch)
tree9b5a0e0fb0e27784ca8b3af2e9db93a4a1169a99 /lisp/calc/calc-comb.el
parent0c98dec5c9d0e0146a1519b9a7e099aae668c059 (diff)
downloademacs-d831312d668fbedeffe3711b13cd455309da84a1.tar.gz
Use iteration in math-factorial-iter
* lisp/calc/calc-comb.el (math-factorial-iter): Use iteration instead of recursion to avoid max-specpdl-size problem. Copyright-paperwork-exempt: yes
Diffstat (limited to 'lisp/calc/calc-comb.el')
-rw-r--r--lisp/calc/calc-comb.el12
1 files changed, 7 insertions, 5 deletions
diff --git a/lisp/calc/calc-comb.el b/lisp/calc/calc-comb.el
index c84ff236851..91fbb7b2b8a 100644
--- a/lisp/calc/calc-comb.el
+++ b/lisp/calc/calc-comb.el
@@ -362,11 +362,13 @@
(math-gammap1-raw '(float -25 -2))))
(defun math-factorial-iter (count n f)
- (if (= (% n 5) 1)
- (math-working (format "factorial(%d)" (1- n)) f))
- (if (> count 0)
- (math-factorial-iter (1- count) (1+ n) (math-mul n f))
- f))
+ (while (> count 0)
+ (if (= (% n 5) 1)
+ (math-working (format "factorial(%d)" (1- n)) f))
+ (setq count (1- count)
+ f (math-mul n f)
+ n (1+ n)))
+ f)
(defun calcFunc-dfact (n) ; [I I] [F F] [Public]
(cond ((Math-integer-negp n)