开始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)
0

else(前面没有匹配到<p>就进入这个)

例 : 绝对值else版

> (define (abs1 x) 
    (cond ((> x 0) x)
      (else (- 0 x))))
      
> (abs1 2)
2
> (abs1 -2)
2
> (abs1 -0)
0

if

语法

: (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)
1

or

语法:
(or (条件1) (条件2) (条件3)…)
也有阻断效果
例:

> (if (or (= 1 2) (= 1 1))  1  0)
1

not

语法:
(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 协议 ,转载请注明出处!

lambda与let 上一篇
对表对树 下一篇