循环:
1)do循环
语法:(do ((变量名 变量初值 (变量变化语句)))
(结束条件 返回值)
循环主体)
CL-USER> (defun draw-line (x)
(do ((i 0 (1+ i)))
((>= i x) nil) ;;nil可以忽略
(format t "*")))
CL-USER> (draw-line 3)
***
NIL
CL-USER> (draw-line 10)
**********
NIL
CL-USER> (defun draw-box (r l)
(do ((i 0 (1+ i)))
((>= i r) nil) ;;nil可以忽略
(draw-line l)
(format t "~%")))
CL-USER> (draw-box 4 10)
**********
**********
**********
**********
NIL
递归:
1)斐波那契数列
求第n个斐波那契数
(defun fib (n)
(cond ((equal n 1) 1)
((equal n 2) 1)
(t (+ (fib (- n 1))
(fib (- n 2))))))
改进版:
(defun fib (n)
(if (or (= n 1) (= n 2)) 1
(+ (fib (- n 1)) (fib (- n 2)))))
打印斐波那契数列
(defun print-fib (n)
(do ((i 0 (1+ i)))
((>= i n))
(format t "~A~%" (fib i))))
2)另一种没有循环体的求斐波那契数列
(defun fib2 (x)
(do ((n 0 (1+ n))
(cur 0 next)
(next 1 (+ cur next)))
((= x n) cur)))
3)阶乘
CL-USER> (defun factorial (n)
(if (= n 1) 1
(* n (factorial (- n 1)))))
FACTORIAL
CL-USER> (factorial 10)
3628800
CL-USER> (factorial 5)
120
5)可以用trace函数查看递归运行内部情形
CL-USER> (defun count-slices (loaf)
(cond ((null loaf) 0)
(t (1+ (count-slices (rest loaf))))))
CL-USER> (count-slices '(x))
1
CL-USER> (count-slices '(a e i o u))
5
CL-USER> (trace count-slices)
(COUNT-SLICES)
CL-USER> (count-slices '(a e i o u))
0: (COUNT-SLICES (A E I O U))
1: (COUNT-SLICES (E I O U))
2: (COUNT-SLICES (I O U))
3: (COUNT-SLICES (O U))
4: (COUNT-SLICES (U))
5: (COUNT-SLICES NIL)
5: COUNT-SLICES returned 0
4: COUNT-SLICES returned 1
3: COUNT-SLICES returned 2
2: COUNT-SLICES returned 3
1: COUNT-SLICES returned 4
0: COUNT-SLICES returned 5
5
(未完待补充。。。)