diff options
author | michael schuldt <mbschuldt@gmail.com> | 2017-04-18 11:24:37 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2017-04-18 11:25:13 -0700 |
commit | d831312d668fbedeffe3711b13cd455309da84a1 (patch) | |
tree | 9b5a0e0fb0e27784ca8b3af2e9db93a4a1169a99 /lisp/calc/calc-comb.el | |
parent | 0c98dec5c9d0e0146a1519b9a7e099aae668c059 (diff) | |
download | emacs-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.el | 12 |
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) |