共计 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 之后, 对于递归有了重新的理解, 自己调用自己并不是递归
只有满足了层层递进, 在层层回归, 才叫做递归
尾递归 (有递进没有回归) 基本都是迭代
正文完