[蛙蛙推薦]SICP第一章學習筆記-編程入門

本書簡介

《計算機程序的構造與解釋》這本書是MIT計算機科學學科的入門課程,
大部分學生在學這門課程前都沒有接觸過程序設計,也就是說這本書是針對編程新手寫的。
雖然是入門課程,但起點比較高,看懂裏面的知識須要比較紮實的數學功底,
最起碼要有高中數學水平,若是高中數學沒學好,看起來會比較吃力。javascript

固然,這本書的目標不是教你去作數學分析,或者讓你學會使用LISP,他的目標我理解以下java

  • 學會使用編程的一些基本元素,以編程的方式思考問題
  • 學會如何使用抽象和創造抽象來解決複雜問題
  • 學會如何良好的組織代碼來編寫大型軟件系統,控制其中的複雜性
  • 是識別出好的程序設計和差的程序設計

以數學來示範各類編程原理是由於數學問題比較廣泛,好多概念你們都有所接觸,
沒有二義性,不須要把時間花在問題描述和需求分析上。以LISP來進行編程原理解
說是由於LISP語法很是簡單,不須要把時間花在講解語法上。編程

程序設計的基本要素

表達式

LISP可能很差安裝,咱們就用Javascript來練習第一章的示範吧,打開Chrome瀏覽器,
按F12打開開發人員工具,在Console標籤裏就能夠寫代碼了。瀏覽器

若是你還不知道編程能幹什麼,Javascript是啥東西,不要緊,
咱們能夠先來實現一些簡單的數學計算,在Chrome的Console裏輸入以下代碼編程語言

>128
128
>128 + 12
140
>128 / 16
8
>128 - 28
100
>50 * 2
100
>3 + 2 * 10
23
>2 * 10 * 3.14
62.800000000000004

上面代碼的大於號不用輸,表示輸入提示符,能夠看到輸入一些數學式子後Console會自動打印出
這個式子的求值結果。暫時先不用管背後的原理是什麼,你如今已經開始在編程了。工具

上面你輸入的式子就叫作表達式,裏面的數就是普通的數字,+,-,*,/這些叫操做符,
操做符能夠操做數,他操做的是本身兩邊的數。學習

命名和環境

像上面的例子裏2 * 10 * 3.14其實就是在計算一個半徑爲10的圓的周長,3.14就是圓周率π,
計算圓的周長的公式不是2πr嗎?設計

若是咱們要計算好多圓的周長,那麼每次都要把3.14打出來嗎?能不能給3.14起個名字呢?
能,確定能。能給某些計算對象命名是全部編程語言裏最重要的一個功能,以下。code

>var pi = 3.14
undefined
>2 * pi * 10
62.800000000000004
>2 * pi * 5
31.400000000000002
>2 * pi * 8
50.24

上面的第一句var pi = 3.14就至關於給3.14起了個名字pi,後面計算周長的表達式均可以用pi來代替3.14。對象

這就是一個最簡單的抽象手段,你不須要記住pi的值具體是多少,只須要記住pi就表示圓周率就好了。
這個思路很關鍵,之後寫代碼寫多了,你會發現你寫的代碼愈來愈複雜,可以給你寫的部分代碼進行命名,
而後使用的時候不用關心複雜的細節,就能夠控制住這種複雜性,寫出複雜的大程序來。

組合式的求值

3 + 2 * 10這個式子,*會先把2和10進行乘法計算,獲得20,而後+會把3和20進行相加,
獲得23,整個過程和數學裏的加減乘除運算規律是同樣的。若是你想執行(3 + 2) * 10的結果,
也能夠直接把這個式子在Console裏輸入,也能正確的執行。

你在寫2 * pi * 10時,pi會自動替換成3.14,這說明Javascript解釋器幫你存儲了pi到3.14
的對應,這種存儲咱們叫環境,每一個環境裏都存儲了一些名字和計算對象的對應關係。
環境是個廣泛的概念,它爲求值的過程提供了一種上下文,對於咱們理解程序
的執行起着很重要的做用。

好比你要執行(3 + 2 + 5) * (2 * (1 + 2)),這個表達式的求值過程就稍微複雜點了。
整體來看呢,這個式子分紅兩個部分,一個是(3 + 2 + 5),一個是(2 * (1 + 2)),而後
這兩個部分進行想乘。要想獲得這兩個部分的相乘呢,又要先獲得這兩個部分的結果,怎麼獲得呢?
咱們發現這兩個部分其實也是表達式,好比(2 * (1 + 2)),其實也有兩部分組成,一個
2,一個是(1 + 2),這兩個部分相乘。這樣從外到裏分析,確定會分析出最簡單的不
能再分的表達式,能夠直接求出結果。

這個過程就叫作遞歸,先不用計較複雜的解釋,就先理解複雜表達式的求值須要先對子表
達式進行求值,子表達式的求值須要對子表達式的子表達式求值,這個過程就叫遞歸

遞歸是個剛開始不太好理解的概念,但掌握後用它來理解不少問題就很輕鬆了,之後會常常
遇到,加深印象。須要提的就是遞歸要有幾個注意的地方。

  1. 遞歸分紅好多個步驟
  2. 每一個步驟要把整個事情向前推動,每次推動都向最終點更近一步。
  3. 整個遞歸過程要有個最終點,不然整個過程就沒法終止了。

好比複雜表達式的求值過程就分紅多個步驟,每一個步驟就是把複雜表達式拆成多個子表達式
,而後每次拆呢,確定是拆的愈來愈小,把整個過程向終點推動一步,而後呢若是拆的不能
再拆了,好比1 + 2直接就能獲得結果了,這就到最重點了。

以上說的這些規則,就叫作編程的語法,慢慢你會發現有的編程語言的語法特別多,須要記住的東西特別多,好比各類括號,特殊字符,關鍵字。 而有的編程語言的語法特別少,基本上不用記,一大屏代碼看到的都差很少的格式。剛學編程的時候建議選擇後面一種的編程語言,如Javascript, Python,儘可能學習一些編程的本質,而不是各類語法。

相關文章
相關標籤/搜索