天天看點

資料結構與算法導論之入門簡介

目前,計算機加工處理的對象由純粹的數值發展到字元、表格和圖像等各種具有一定結構的資料,這就給程式設計帶來了一些新的問題。為了編寫一個好的程式,必須分析待處理的對象的特征以及各處理對象之間存在的關系,這就是“資料結構”這門學科形成和發展的背景。

“資料結構”作為一門獨立的課程,在國外是從1968年才開始設立的。

1、什麼是資料結構?

答:大量資料的組織方法。

2、什麼是算法分析?

答:算法運作時間的估計。

3、在學習資料結構和算法分析的過程中,最重要的就是解決以下2個問題:

一是對于大規模的輸入,如何估計程式的運作時間,更重要的是,弄清如何在尚未具體編碼的情況下比較兩個程式的運作時間;

二是如何提高程式的運作速度以及确定程式瓶頸的技巧。

4、遞歸的介紹

當一個函數用自身定義時就稱為是遞歸(recursive)的。

c++允許函數是遞歸的,但必須要記住,c++所做的僅僅是試圖遵循遞歸思想,不是所有的數學遞歸函數都能被有效或者正确地用c++的遞歸模型來實作。要點在于,遞歸函數f應該像非遞歸函數一樣隻用幾行就能表示出來。下面給出一個執行個體。

實驗結果如下:

資料結構與算法導論之入門簡介

注意:為了使結果在視窗保留以便觀察,可以在return 0前面加上“cin.get();”

資料結構與算法導論之入門簡介

小技巧~~~

從代碼可以看出,f(0)=0是基準情況,c++的遞歸若無基準情況也是毫無意義的,因為遞歸調用将一直進行到基準情形出現為止。

關于遞歸有幾個可能混淆的概念:

(1)、它是循環邏輯嗎?

答案:不是。因為遞歸雖然用一個函數本身來定義這個函數,但是并沒有用一個函數執行個體本身來定義該特定執行個體。舉例說明,f(5)是通過f(5)得到的值才是循環的,使用f(4)得到的f(5)就不是循環的。

(2)、遞歸與循環的差別與聯系?

答案:後面詳解。

下面給出一個“無終止遞歸函數”執行個體:

bad(1)被定義為bad(1),是以永遠得不到正解,除0之外,此程式對任何非負n都無效。

上面的讨論引出遞歸的前兩個基本法則:基準情形(base cases)、不斷推進(making progress)。其餘兩個是:設計法則(design rule)、合成效益法則(compound interest rule)。

下面給出一個“列印整數的遞歸”例程作為練習。

繼續閱讀