我写了一个函数,它返回小于20的数字n的素因式分解。函数使用let创建指数列表,并在发现n可被a整除时递增这些指数主要。在我的Lisp解释器(包括gcl和clisp)中,当我调用下面的函数一次时,我得到了正确的因式分解,但是当我第二次调用它时,我得到了第一个和第二个函数的分解总和 - 但是exponents
的范围不限于let!的内部!为什么exponents
被重新赋值为'(0 0 0 0 0 0 0 0)
?我怎样才能重新编写这个功能,以便能够承受多次通话?函数内部变量的范围
(setf primes '(2 3 5 7 11 13 17 19))
(defun factorize (n)
(let ((exponents '(0 0 0 0 0 0 0 0)))
(loop for i from 0 to (- (length primes) 1) do
(loop while (and (= (mod n (nth i primes)) 0)
(not (= n 1))) do
(incf (nth i exponents))
(setf n (/ n (nth i primes)))))
(return-from factorize exponents)))
输出:
>(factorize 10) ;; first time
(1 0 1 0 0 0 0 0) ;; 2^1*5*1 = 10, correct
>(factorize 10)
(2 0 2 0 0 0 0 0) ;; wrong
>(factorize 10)
(3 0 3 0 0 0 0 0)
引用数据是文字数据。如果您熟悉C语言,则可以从代码中的字面字符数组中识别行为。 * reader *为您创建一个零字面的列表,并且该列表存储在编译后的代码中,因此您只有一个列表,并且它在该函数的所有运行之间共享。 – 2014-10-09 18:17:11