文章太少了,于是贴点东西上来好了。
刚开始学习lisp,写了一些极其简单的程序来练手。
;;;欧拉函数的计算
;;;递归触发函数 (defun Euler (n) (e n 2))
;;;这个版本遇素数会溢出(defun euler-recursive (n b) (if (= n 1) 1 (if (= (mod n b) 0)(if (= (mod (/ n b) b) 0) (* b (euler-recursive (/ (/ n b) b) b)) (* (- b 1) (euler-recursive (/ n b) (+ b 1)))) (euler-recursive n (+ 1 b)))));;;这个版本使用循环进行优化 避免了一些会导致堆栈溢出的情形(defun e (n b) (if (= n 1) 1 (loop for i from b to n do (if (= (mod n i) 0) (if (= (mod (/ n i) i) 0) (return (* i (e (/ (/ n i) i) i)))(return (* (- i 1) (e (/ n i) (+ i 1)))))))))
;;;不使用递归的版本
(defun eu (n) (let ((res n)(m n)) (loop for i from 2 to (isqrt n) do (if (= (mod m i) 0) (progn(setf res (* (/ res i) (- i 1))) (loop while (= (mod m i) 0) do (setf m (/ m i)))) )) (if (> n 1)(setf res (* (/ res n) (- n 1)))) res))
这里lisp代码竟然不能高亮,作为plain贴进来会很糟糕。