LISP -- 函数式编程

703 阅读3分钟

React是抄袭了函数式,而LISP是函数式的正宗

所以我去看了SICP这本书,全名叫做<<计算机程序的构造和解释SICP>>

从而学习了Lisp,LISP是一种通用高级计算机程序语言, 它是作为因应人工智能而设计的语言,是第一个声明式系内函数式程序设计语言.

基本语法 :

1. 加法运算语法: (+ a b):
          // a 加 b,转换成js,就是a + b
          例如: (+ 1 2) // 3

2. 乘法运算: (* a b) 
          // a 乘 b,转换成js,就是a * b 
          例如: (* 2 3) // 6
          
3. 命名: (define size 5) 
          // define 就是用来进行声明的特是字符 
          // 这里是声明一个变量size,变量的值是5 
          // 再次进行计算,5 乘 2,js表示就是5 * 2 
          例如: (* size 2) // 10
       
4. 复合过程 (就像是声明一个函数): 
          // define 就是用来进行声明的特是字符 
          // 声明了一个add的函数,参数是a b,执行逻辑是a 加 b (define (add a b) (+ a b)) 
          例如: (add 1 2) // 3 
          // 声明了一个sq的函数,参数是a b,执行逻辑是a 乘 b (define (sq a b) (+ (* a a)(* b b))) 
          例如: (sq 1 2) // 5

5. if(条件判断): 
          // 声明了一个abs函数,函数的参数是a 
          // 后面是执行逻辑,如果a大于0,返回值是a,否则返回值是-a 
          例如: (define (abs a) (if (> a 0) a (- a)))

递归: 

// 用一个例子来做一个递归的函数,求6的阶乘(就是1\*2\*3\*4\*5\*6) 
// 思考: 可能会是任意数,所以需要定义函数进行传参,从n开始,乘以n-1,当最后的值等于1,我们就乘以1结束 
// define声明一个fn的函数,参数是n
(define (fn n) 
    // 如果n等于1,返回1,否则就是n乘n-1,但是n-1还可能不等于1,那就继续计算,再次调用fn,传入n-1 
    // n-1会成为fn的参数,进行下一步计算,直到n等于1,结束计算 
    (if (= n 1) 
        1 
        (* n (fn (- n 1))) 
    ) 
)

迭代: 

       // 用一个例子来做一个迭代的函数,求6的阶乘(就是1\*2\*3\*4\*5\*6) // 迭代就是从1到n的一个正向操作 
       // fn对ft进行封装
       (define (fn n) 
         // 调用ft函数 
         (ft 1 1 n) 
        )
        // 定义ft执行逻辑(result n maxN三个参数)
        (define (ft result n maxN)
          // 如果 n大于maxN,返回result,否则继续ft,并改写了参数 
          (if (> n maxN) 
             result 
             (ft (* n result) (+ n 1) (maxN)) 
          ) 
        )

高阶函数: 

   在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数 

     1. 接受一个或多个函数作为输入

     2. 输出一个函数


总结: 
     1. 学习了Lisp之后,对于递归有了重新的理解,自己调用自己并不是递归

     2. 只有满足了层层递进,在层层回归,才叫做递归

     3. 尾递归(有递进没有回归)基本都是迭代