「c# :使用遞迴尋找一維整型陣列中的最大值」傳說中的入門演算法。首先我們用簡單的for迴圈語句,遍歷一遍陣列就可以找出它的最大值:
1顯然這不符合我們的要求,在《演算法:c語言實現》一書中介紹分治法時候就是用的這個例子。public
class
test ;
4int max = array[0];5
//通過使用for迴圈求出array陣列的最大值
6for (int i = 0; i < array.length; i++)
10 console.writeline("
array陣列中最大的值為:
" +max);
11console.read();12}
1314 }
分治法的設計思想是,將乙個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。接下來我嘗試用自己的理解,結合手上的資料設計出使用分治法求陣列最大值的方法。分治策略是:對於乙個規模為n的問題,若該問題可以容易地解決(比如說規模n較小)則直接解決,否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。這種演算法設計策略叫做分治法。
如果原問題可分割成k個子問題,1
以陣列array為例:int array = new
int ;
1.將函式分成array[0],array[1],...,array[4]和array[5],array[6],...,array[8]兩部分,逐步將問題為9的問題變成5和4的問題,再將5的問題變成3和2的問題,以此類推。最後變為都是1的問題。
圖1:表示將問題9的問題,逐步轉化成問題為1的子問題。
2.解決最小的問題(即是解決陣列中兩數的大小,並返回大的數),此時可以看出比較後有返回值
圖2:代表array的索引值,每個橢圓節點表示一次遞迴函式的呼叫,方形節點表示每次遞迴呼叫的終結。
圖3:代表array的具體值,每個橢圓節點表示一次遞迴函式的返回值,方形節點表示每次遞迴呼叫的終結點的返回值。
3.由此我們可以想到肯定有個函式執行著這樣乙個過程:
66 max(0,8)
23 max(0,4)
5 max(0,2)
4 max(0,1)
....
個人覺得遞迴演算法的設計需要你有雙發現規律的眼睛。以下是實現**:
1理解的不是很好。public
class
test ;
5 console.writeline(getmax(array, 0, 8
));6
console.read();7}
8public
static
int getmax(int array,int l,int
r) 16 }
新手,歡迎指教!
從一道php面試題說起
面試題目 setcookie name test echo cookies name 請說出程式結果 能說出第一次與第二次的區別者加分 本來一開始我認為不就是設定乙個cookie,然後讀出來的問題,但是被那個後面的提示搞迷惑了從來沒有想過這樣的問題。面試的時候也沒有想出答案,後來在面試官的指點下搞清...
從一道面試題開始說fork
自 http blog.csdn.net yuwenliang archive 2010 01 18 5209239.aspx 給出如下c程式,在linux下使用gcc編譯 1 include stdio.h 2 include sys types.h 3 include unistd.h 4 5 ...
一道面試題
一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...