程序開(kāi)發(fā)過(guò)程
- 分析階段:程序開(kāi)發(fā)的第一步是弄清問(wèn)題累提。在軟件開(kāi)發(fā)領(lǐng)域皱碘,這一工作階段通常被稱(chēng)為需求分析财剖。
- 設(shè)計(jì)階段:?jiǎn)栴}的嚴(yán)格描述仍然是描述性的幌羞,而計(jì)算機(jī)求解是一個(gè)操作過(guò)程。在真正編程之前竟稳,需要有一個(gè)能解決這個(gè)問(wèn)題的計(jì)算過(guò)程模型属桦。這種模型包括兩個(gè)方面,一方面需要表示計(jì)算中處理的數(shù)據(jù)他爸,另一方面必須有求解問(wèn)題的計(jì)算方法聂宾,即通常所說(shuō)的算法。
- 編碼階段:有了解決問(wèn)題的抽象計(jì)算模型诊笤,下一步工作就是用某種適當(dāng)?shù)木幊陶Z(yǔ)言實(shí)現(xiàn)這個(gè)模型系谐,做出一個(gè)可能由計(jì)算機(jī)執(zhí)行的實(shí)際計(jì)算模型,也就是一個(gè)程序。
- 檢查測(cè)試階段:復(fù)雜的程序通常不可能一蹴而就纪他,寫(xiě)出的代碼中可能有各種錯(cuò)誤鄙煤,最簡(jiǎn)單的是語(yǔ)法和類(lèi)型錯(cuò)誤。經(jīng)過(guò)反復(fù)檢查修改茶袒,最后得到一個(gè)可以運(yùn)行的程序梯刚。
- 測(cè)試/調(diào)試階段:程序可以運(yùn)行并不代表它就是所需的那個(gè)程序,還需要通過(guò)嘗試性的運(yùn)行確定其功能是否滿足需要薪寓,這一工作階段稱(chēng)為測(cè)試和調(diào)試亡资。測(cè)試/調(diào)試過(guò)程中可能會(huì)出現(xiàn)運(yùn)行時(shí)錯(cuò)誤和邏輯錯(cuò)誤,需要修正向叉,直至得到令人滿意的程序锥腻。
- 以上即一個(gè)從問(wèn)題出發(fā),最終得到可用程序的開(kāi)發(fā)過(guò)程母谎。
- 相對(duì)而言瘦黑,設(shè)計(jì)階段的工作更困難一些。編碼階段的工作相對(duì)容易一些销睁。
一個(gè)簡(jiǎn)單例子
雖然一個(gè)問(wèn)題的說(shuō)明性描述與其操作性描述表達(dá)的是同一個(gè)問(wèn)題供璧,但它們卻非常不同。前者說(shuō)明了需要解決的問(wèn)題是什么冻记,針對(duì)什么樣的問(wèn)題睡毒,期望什么樣的解;而后者說(shuō)明通過(guò)怎樣的操作過(guò)程可以得到所要的解冗栗。
如:求出任一個(gè)非負(fù)實(shí)數(shù)的平方根(牛頓迭代法)演顾。
算法描述
- 對(duì)給定正實(shí)數(shù) x 和允許誤差 e ,令變量 y 取任意正實(shí)數(shù)值隅居,如令 y=x 钠至;
- 如果 y*y 與 x 足夠接近,即 |y*y-x| < e 胎源,計(jì)算結(jié)束并把 y 作為結(jié)果棉钧;
- 取 z=(y+x/y)/2 ;
- 將 z 作為 y 的新值涕蚤,回到步驟 1 宪卿。
Python 程序?qū)崿F(xiàn)
def sqrt(x):
y = 1.0
while abs(y * y - x) > 1e-6:
y = (y + x/y) / 2
return y
其中,變量 y 初值為 1.0万栅,允許誤差為 10-6佑钾。通過(guò)各種數(shù)值測(cè)試,可以看到這個(gè)函數(shù)確實(shí)能完成所需要的工作烦粒。
總結(jié)
在上述例子中休溶,最不清晰的是從平方根的定義到求平方根的算法。然而 ......
算法設(shè)計(jì)是一種創(chuàng)造性工作,依賴(lài)于對(duì)問(wèn)題的認(rèn)識(shí)和相關(guān)領(lǐng)域的知識(shí)兽掰,沒(méi)有放之四海而皆準(zhǔn)的路徑可循芭碍。
摘自北大裘宗燕老師《數(shù)據(jù)結(jié)構(gòu)與算法》