從一道面試題中學學遞迴,分治法

2022-02-21 17:10:09 字數 1845 閱讀 4935

「c# :使用遞迴尋找一維整型陣列中的最大值」

傳說中的入門演算法。首先我們用簡單的for迴圈語句,遍歷一遍陣列就可以找出它的最大值:

1

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 }

顯然這不符合我們的要求,在《演算法:c語言實現》一書中介紹分治法時候就是用的這個例子。

分治法的設計思想是,將乙個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。

分治策略是:對於乙個規模為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...