函數式編程LISP

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