函数式编程LISP

46次阅读

共计 1177 个字符,预计需要花费 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. 输出一个函数
总结:
   学习了 Lisp 之后, 对于递归有了重新的理解, 自己调用自己并不是递归 
   只有满足了层层递进, 在层层回归, 才叫做递归 
   尾递归 (有递进没有回归) 基本都是迭代

正文完
 0