开始Lisp
基本加减乘除
加
>(+ 1 2)
3减
>(- 2 1)
1乘
>(* 1 2 3)
6除
>(/ 4 2)
2
define
定义一个事物
>(define size 2)
>size
2
>(* size 3)
6定义成无参
>(define fun (+ size 1)
>fun
3
定义成有参
> (define (fun1 x y) (* x y)
> (fun1 2 3)
6
复合语句
> (define fun11 (fun1 2 3))
> fun11
6
应用序与正则序
复合语句中
应用序:先求值后展开
正则序:全部展开后在求值(会重复求值,效率有点低)
条件表达式和谓词
cond (条件)
语法
: (cond (
)( )…)
例: 一个数的绝对值
> (define (abs x)
(cond ((> x 0) x)
((= x 0) 0)
((< x 0) (- 0 x))))
> (abs 2)
2
> (abs -2)
2
> (abs 0)
0else(前面没有匹配到<p>就进入这个
) 例 : 绝对值else版
> (define (abs1 x)
(cond ((> x 0) x)
(else (- 0 x))))
> (abs1 2)
2
> (abs1 -2)
2
> (abs1 -0)
0if
语法
: (if (条件) (为真的时候)(为假的时候))
例:
绝对值 if 版
> (define (abs x)
(if (> x 0)
x
(- 0 x)))
> (abs 2)
2
> (abs -2)
2
> (abs 0)
0复合运算符
and
语法:
(and (条件1) (条件2) (条件3)…)
有阻断效果(如果条件2是假那么条件3就不会执行)
例:
> (if (and (> 2 1) (= 2 2)) 1 0)
1or
语法:
(or (条件1) (条件2) (条件3)…)
也有阻断效果
例:
> (if (or (= 1 2) (= 1 1)) 1 0)
1not
语法:
(not (条件)) (真的变假,假的变真)
例:
> (if (not (= 1 2)) 1 0)
1线性的递归与迭代
计算n!
递归:
> (define (n! x)
(if (= x 1)
1
(* x (n! (- x 1)))))
> (n! 3)
6
> (n! 5)
120迭代:
> (define (fun r n x)
(if (> n x)
r
(fun (* r n) (+ n 1) x)))
> (define (x! n)
(fun 1 1 n))
> (x! 3)
6
> (x! 5)
120区别:
迭代:先计算然后调用下一个 ,这样计算机需要保存的数据就会很少。 (有点类似for 。 while)
递归:先把生成完整的算式然后在计算,这样计算机要保存的数据就会很多,更加占用资源。(有点类似其他语言的函数调用)
树形递归
斐波那契数序
例:
> (define (fib n)
(cond ((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1))
(fib (- n 2))))))
> (fib 1)
1
> (fib 2)
1
> (fib 9)
34
> (fib 5)
5线性迭代
斐波那契数序
例:
> (define (tem f s t n)
(cond ((= t n) f)
(else (tem s (+ f s) (+ t 1) n))))
> (define (fib n)
(tem 0 1 0 n))
> (fib 0)
0
> (fib 1)
1
> (fib 2)
1
> (fib 3)
2
> (fib 4)
3
> (fib 5)
5
> (fib 9)
34书上代码:
> (define (fib n)
(fib-iter 1 0 n))
> (define (fib-iter a b count)
(if (= count 0)
b
(fib-iter (+ a b) a (- count 1))))
> (fib 1)
1
> (fib 2)
1
> (fib 3)
2
> (fib 9)
34本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!