SCIP讀書筆記(二)

上一篇中介紹了一門程序設計語言必須具備的一些特性倔毙,以及Scheme語言的基本語法溅潜。這一篇用上一篇提到的平方根的問題來看看一個問題是如何被逐步分解并解決的。我們首先看下平方根的數(shù)學定義:

平方根的數(shù)學定義

上面的數(shù)學公式描述了一個數(shù)的平方根所具備的性質厌衙,但并沒有告訴我們應該如何去求一個數(shù)的平方根畦木。這是數(shù)學公式和計算機程序的不同之處兜粘。對于同一個問題申窘,數(shù)學公式關心的是該問題的解所具備的性質 (what is);而計算機程序則關心應該如何去得到問題的解 (how to)孔轴。那么到底求一個數(shù)的平方根呢剃法?我們這里使用牛頓提出的無窮逼近法,這個算法思路很簡單路鹰,先假定我們要求數(shù)y的平方根x

  1. 為x設定一個初始值
  2. 檢查x^2是否等于y贷洲,若是,則返回x, 否則將x賦值為(x+(x/y))/2
  3. 重復執(zhí)行第2步直到獲得解晋柱。

簡書的markdown對數(shù)學公式支持的不好优构,請見諒。有了上面的描述趣斤,我們就可以很快寫出代碼了俩块,下面我就試試使用Scheme語言來實現(xiàn)黎休。這里還是要扯點題外話浓领,我看SCIP這本書并不是為了學習Scheme語言,而是學習書中分析問題和將抽象問題的方法势腮,學習了這些之后联贩,你會恍然發(fā)現(xiàn)現(xiàn)在大多數(shù)語言或者工具的一些特性在這本書中都講到了,比如python語言捎拯、guava庫泪幌、Java8主打的lambda表達式,stream等署照。編程語言的發(fā)展有兩條截然不同的路祸泪,一條是為了適應計算機底層硬件或者說計算機體系結構發(fā)展起來的,最具代表性的就是C語言建芙;另一條路則是關心計算的本質(比較抽象没隘,這里僅是個人觀點),主要的代表就是Lisp語言禁荸,而我們這里的談到的Scheme就是Lisp語言的一種變體右蒲。但隨著技術的發(fā)展,這兩種不同類型的語言有點融合的趨勢赶熟。
在寫代碼前瑰妄,我們首先分析下這個問題,在上一篇中我們說過映砖,要解決一個問題時间坐,我們應該將問題進行分解,得到多個子問題,當子問題解決后眶诈,我們將子問題的解組合就得到了原問題的解涨醋。通過算法的描述我們可以將原有的問題分解成一些子問題:判斷數(shù)x是不是問題的解;使用算法描述中的方法將x加以改進逝撬,每次對x的改進都能夠更加接近問題的解浴骂,這就是無窮逼近。我們用Scheme語言翻譯下就是這樣:

(define (sqrt-iter x y)
    (if (good-enough? x y)
         x
         (sqrt-iter (imporve x y) y)))

這里引入了函數(shù)sqrt-iter宪潮,它接收兩個參數(shù)x和y溯警,x表示對y的平方根的猜想,通過遞歸調(diào)用(在Scheme語言里十分重要)得到解狡相。在sqrt-iter里又引入了兩個函數(shù):good-enough?和imporve梯轻,對應著我們分析的兩個子問題。而good-enough?應該如何定義的呢尽棕?它接收兩個參數(shù)x和y喳挑,判斷x^2是否等于y。這個問題是一個比較經(jīng)典的面試題:判斷兩個浮點數(shù)是否相等滔悉。

(define (good-enough? x y)
    (< (abs (- (square x) y)) 0.001))
(define (square x) (* x x))
(define (abs x) 
    (if (> x 0) x (- x)))

improve函數(shù)我們可以根據(jù)算法描述得到:

(define (improve x y) 
    (average x (/ x y)))
(define (average x y)
    (/ (+ x y) 2))

這些子問題解決后伊诵,原問題就迎刃而解了:

(define (sqrt x)
    (sqrt-iter 1.0 x))

這里我們假定任何數(shù)的平方根的初始值為1.0。現(xiàn)在我們再來看下sqrt函數(shù)回官,我們可以得到下面這張圖:

sqrt函數(shù)分解圖

我們在處理原問題(sqrt)的時候曹宴,我們只需關心抽象的各個子問題,而每個子問題又可以分解為更多的子問題歉提,各個子問題可以看做是一個個的黑匣子笛坦,我們無需關心起內(nèi)部實現(xiàn)的細節(jié),我們關心其提供的功能就夠了苔巨。其實任何的程序設計都可以通過這種手段去將問題逐步分解版扩,這里的分解還需要注意一個問題,就是每個被分解后的子問題應該遵循單一職責的原理侄泽,只有這樣礁芦,解決該子問題的方法才有可能被其他的模塊進行復用。就像搭積木的例子里蔬顾,我們應該去組合一些通用形狀的積木宴偿。
好了,這一篇就簡單介紹了分析問題的方法诀豁。有疑問窄刘?請留言。另外課后的作業(yè)有一道題是之前搜狗公司的面試題舷胜,讀者可以思考下:

有inc函數(shù)和dec函數(shù)娩践,inc函數(shù)的作用是將輸入的參數(shù)加1后返回活翩,dec函數(shù)的作用是將輸入的參數(shù)減1后返回,利用inc函數(shù)和dec函數(shù)定義加法函數(shù)翻伺。
(define (+ a b) (...))

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末材泄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吨岭,更是在濱河造成了極大的恐慌拉宗,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辣辫,死亡現(xiàn)場離奇詭異旦事,居然都是意外死亡,警方通過查閱死者的電腦和手機急灭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門姐浮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葬馋,你說我怎么就攤上這事卖鲤。” “怎么了畴嘶?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵蛋逾,是天一觀的道長。 經(jīng)常有香客問我掠廓,道長换怖,這世上最難降的妖魔是什么甩恼? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任蟀瞧,我火速辦了婚禮,結果婚禮上条摸,老公的妹妹穿的比我還像新娘悦污。我一直安慰自己,他們只是感情好钉蒲,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布切端。 她就那樣靜靜地躺著,像睡著了一般顷啼。 火紅的嫁衣襯著肌膚如雪踏枣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天钙蒙,我揣著相機與錄音茵瀑,去河邊找鬼。 笑死躬厌,一個胖子當著我的面吹牛马昨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸿捧,長吁一口氣:“原來是場噩夢啊……” “哼屹篓!你這毒婦竟也來了?” 一聲冷哼從身側響起匙奴,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤堆巧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后泼菌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恳邀,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年灶轰,在試婚紗的時候發(fā)現(xiàn)自己被綠了谣沸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡笋颤,死狀恐怖乳附,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伴澄,我是刑警寧澤赋除,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站非凌,受9級特大地震影響举农,放射性物質發(fā)生泄漏。R本人自食惡果不足惜敞嗡,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一颁糟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喉悴,春花似錦棱貌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至勺像,卻和暖如春障贸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吟宦。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工篮洁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人督函。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓嘀粱,卻偏偏與公主長得像激挪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锋叨,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容