經過前三章,問題定義分析——演算法設計——資料結構選擇,這部分主要是編寫正確的**(包括偽**)
1.問題:二分搜尋
這部分一直都以二分搜尋為核心進行講述,自己寫的函式如下:
templateint bsearch(t *a, int l, inth, t obj)
改為迭代方式:
templateint bsearch2(t*a, int l, inth, t obj)
return -1
;}
2.編寫偽**,類似與迭代式,並利用迴圈不變式(初始化,終止,保持三個性質)對過程進行了詳盡分析。證明了偽**的正確性
3.原理
這部分一直強調 斷言 與 程式驗證。 個人理解,
斷言:就是一些合理的推論,我們根據一定的已知條件,做出斷言(也就是推出未知條件)。所以進行什麼樣的斷言 決定了程式是否正確,以及程式的走向。
函式:要驗證乙個函式,需要兩個斷言:乙個是前置條件——呼叫函式之前就應該成立的狀態;乙個是後置條件——由函式在終止執行是保證。所以如果乙個函式能夠保證在前置條件滿足時呼叫它,能夠確立後置條件。那麼函式就是正確的。
4.習題
4.2尋找第一次出現或最後一次出現的p
4.6問題描述:乙個咖啡罐中有一些黑豆和白豆,另有一堆額外的黑豆,重複下面過程,知道罐中只剩乙個豆子為止:
從罐中隨機取兩顆豆子,若顏色相同,將兩個都扔掉,放入乙個額外的黑豆;
若顏色不同,放回白豆,扔掉黑豆。
證明這個過程會終止,分析最後罐中豆子的顏色?
因為每次豆子總數會減少1,所以過程一定會終止。而每次白豆都是扔掉兩個或0個,所以白豆的奇偶性不會改變,故 最後乙個豆子要想是白豆,那麼必須保證開始罐中有奇數個白豆。
4.7這個問題可以轉化為乙個相似的常見問題,因為對乙個確定的x,其y值是已經排好序的,所以 直接從該點畫一條垂直於x軸的豎線,點在該豎線上,並且y已排好序,對其y值進行二分搜尋,到最後 l+1 == h 時,點就在此時的l和h表示的區間內。
計算步驟如下:
1)對x,計算y0,y1,...yn-1。後面n個數組成乙個有序陣列y
2)在有序陣列y中對y進行二分搜尋
int bsearch(int *y, int n, inty)
if(a[mid] >obj)
else
}if(down == 0
)
return (-#, 0
);
if(up == n-1
)
return (n-1
, #);
}
程式設計珠璣 讀書筆記 第四章 編寫程式
2013 07 14 11 46 35 通過對二分搜尋法的例項分析,展示了程式驗證的的諸多優勢 問題很重要,需要認真地編寫 程式的開發需要遵循驗證思想 可以使用一般性的工具進行程式的正確性分析。感覺本章的內容有比較多的術語不是很好理解,看了兩遍,大致有點概念。本章討論的程式驗證的含義指的是驗證程式 ...
程式設計珠璣 第四章 編寫正確的程式
1 對下標限定界限 加條件 0 l u n 1 2 這個函式可以寫成如下形式 include using namespace std int bs int a,int begin,int end,int v if e a end e v return e a return 1 int main co...
程式設計珠璣 第四章 編寫正確的程式
1 對下標限定界限 加條件 0 l u n 1 2 這個函式可以寫成如下形式 include using namespace std int bs int a,int begin,int end,int v if e a end e v return e a return 1 int main co...