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以後,對於遞歸有了從新的理解,本身調用本身並非遞歸
只有知足了層層遞進,在層層迴歸,才叫作遞歸
尾遞歸(有遞進沒有迴歸)基本都是迭代