练手的程序

文章太少了,于是贴点东西上来好了。

刚开始学习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贴进来会很糟糕。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值