C 演算法之遞迴折半查詢(七)

2021-09-26 22:28:06 字數 1653 閱讀 2779

只有排序之後的資料才能進行折半(二分)查詢。

引用部落格的一段話來理解遞迴如何理解遞迴

要理解遞迴,我們要退一步,了解另乙個概念——「分而治之」。稍微了解程式設計的人,對這個概念應該不陌生。通俗的說,假如我們有這樣乙個問題a,如果能把a分解成一系列比a更容易解決的子問題(a0,a1,a2……an),通過解決子問題(a0,a1,a2……an)來最終達成解決問題a,這個就是「分而治之」。從本質上來說遞迴就是「分而治之」概念的乙個應用。以遞迴計算斐波納切數列來舉例,要計算斐波納切數列的第n項該怎麼辦?通過數列的定義我們知道第n項的值等於第 n-1 項加上第 n-2 項,所以我們可以把計算第n項這個問題分解成計算 n-1 項和 n-2 項兩個子問題。我們知道計算 n-1 和 n-2 項要比計算n項更容易點(因為 n-1 和 n-2 都比n要來得小)。那麼 n-1 項由如何計算呢?根據定義 n-1 項等於 (n-1)-1 項和 (n-1)-2 項的值,好了,我們在這裡碰到了遞迴,好,我們先就此打住。因為n在一直減少,最終會減到1,再減到0,而第0項和第1項的值我們不用計算就知道的,這就是遞迴終結的時候了。

通用概括一下,在面對遞迴問題時,我們可以用「分而治之」的概念去幫助理解。步驟如下:

把問題分解成更容易解決的子問題集合,比如可以把計算斐波那契數列的第n項問題分解轉換成計算第n-1項加上第n-2項這兩個子問題

假設我們有乙個函式可以應用在所有的子問題上,比如計算斐波那契數列的fibo函式

基於步驟2的函式,實現如何把子問題的解拼成最終問題的解,這就是遞迴部分,在計算斐波那契數列的例子裡就是fibo(n-1) + fibo(n-2)部分

遞迴部分確定了,然後再考慮子問題最終簡化到到最底層時該返回什麼值。

上面4步都做好了之後,剩下的就只是毫無條件的相信計算機了……

c++**如下

#include 

using namespace std;

int binarysearch_i

(int *a,

const int x,

const int n)

;int binarysearch_r

(int *a,

const int x,

const int left,

const int right)

;int main()

; int 結果;

int num =7;

if((結果 =

binarysearch_r

(m,num,0,

8))<0)

elseif(

(結果 =

binarysearch_i

(m,num,9)

)<0)

else

return0;

}//迭代

int binarysearch_i

(int *a,

const int x,

const int n)

return-1

;}//遞迴

int binarysearch_r

(int *a,

const int x,

const int left,

const int right)

return-1

;}

折半查詢的遞迴演算法

可能很多地方做得不好,希望大家給我意見。這個演算法是用c 寫的折半查詢的演算法,用的是遞迴演算法。演算法 折半查詢的遞迴演算法 includeusing namespace std define maxsize 100 define ok 1 typedef structelemtype typed...

查詢演算法之折半查詢

binary search 折半查詢又稱二分查詢,要求資料序列呈線性結構,即先排序,在查詢。可以明顯的提高查詢速度,其流程如下 預設陣列為a 需查詢的值為x 首先設定3個變數low mid high,分別儲存陣列元素開始 中間和末尾元素的序號。接著進行以下判斷。1 如果陣列中序號為mid的值與需查詢...

c 折半查詢演算法

何謂折半查詢,舉個例子很快就可以明白,給你了9個數 1 2 3 4 5 6 7 8 9 讓你去找2在 這時候你肯定會說這太簡單了,但是計算機就沒那麼強了,它得拿著2和這9個數乙個乙個的比較,2在前面還好比較的次數比較小,但是如果讓你找6在哪呢,需要比較的次數就多了,可能你覺得多這一次兩次沒什麼差別,...