線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1735
推到 Plurk!
推到 Facebook!

使用遞迴搜詢陣列內最大值

 
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-09-16 20:09:02 IP:59.104.xxx.xxx 訂閱

#include
#include
int main()
{
int LIST[10] ={44,74,546,445,66} , n;
n = sizeof(LIST) / 4;

printf("%d",max(LIST,n-1));
system("pause");
return 0;
}

int max(int LIST[], int n )
{
if (n == 0) return LIST[n];
else
if (LIST[n] > max(LIST,n - 1))
return LIST[n];
else
return max(LIST,n - 1); // 搞不懂這作用

}

想很久還是搞不懂 , 懂的朋友可以說一下嘛??

謝謝

syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-09-16 21:00:57 IP:59.104.xxx.xxx 訂閱

if (LIST[n] > max(LIST,n - 1)) 程序開始應該是一直遞歸max(LIST,n - 1)) 當 n == 0 時候 return LIST[0] , 相當於 return 44 ,

之後返回
1. if ( LIST[1] > 44 ) return LIST[1]; //LIST[1] = 74 , return 74;
2. if ( LIST[2] > 74) return LIST[2]; //LIST[2] = 546 , return 546;
3. if ( LIST[3] > 546 ) , 但 LIST[3] = 445 ;

之後else return max(LIST,n - 1); 用意何在我這搞不懂之後的變化?

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-09-17 07:03:44 IP:61.229.xxx.xxx 未訂閱

你好,

首先,講個題外話,你這個程式一定只能用c 來compile,僅管整個程式明明就是C,為何這麼說? 因為max這個function本來就是存在的,c 有,c也有,差別只是在c 可允許複載,所以你才可以過關。不然你用c的選項來跑就會出錯。建議不要使用這個名稱,改用 __max或my_max等。

回正題,你要先了解這個自定的max function它的意義,它是先從第n-1個(以0起算)往前n-2比較,再用n-2與n-3比,直到n=0。然後算出從n-1至0中所有的值誰最大。這句話很重要,先記一下,等一下會用到這想法。

一開始你可能會覺得若n-i 比n-i-1 大(後比前大),當然就回傳n-i(後),然後讓n-i 1(後後)來和回傳的值比。一路若是都後比前大,當然就沒問題,最後的那一個就是最大值。但是,若是前比後大怎麼辦呢? 是否就簡單的傳回前值? 這是很簡單的想法,但有點小問題。請看:
1. if ( LIST[1] > 44 ) return LIST[1]; //LIST[1] = 74 , return 74; //傳後
2. if ( LIST[2] > 74) return LIST[2]; //LIST[2] = 546 , return 546; //傳後
3. if ( LIST[3] > 546 ) , 但 LIST[3] = 445 ; //若這裡就單純回傳前一個546,然後讓546再和下一個66比,於是
4 if ( LIST[4] > 546 ) , 但 LIST[4] = 66; //於是用剛剛的原則,傳回前一個,就變成傳回LIST[3] = 445,然後用445和後面的比。怪怪的,我們想要傳的並是445而是546,因為546是目前最大的。所以,若單純的用後與前比,後大傳後,前大前傳的想法,是行不通的。即

int max(int LIST[], int n ) //這function就是用來傳回目前位址的前面所有數的最大值
{
if (n == 0) return LIST[n];
else
if (LIST[n] > max(LIST,n - 1))
return LIST[n]; //傳回後值
else
// return max(LIST,n - 1); // 搞不懂這作用 //傳回目前位址的前面所有數的最大值
return LIST[n-1]; //單先純傳回前值,這樣是行不通的

}

不過到此我們有個線索,就是我們應該要傳的是「目前為止的前面」最大的值。即我們想回傳的是546而非和66相鄰的445。咦?? 回想最上面的話,請記住的那句話「自定的max這個function的意義就是算出從n-1至0中所有的值誰最大」。
所以就剛好又套用遞迴就好了,即 return max(LIST,n - 1); 。

1. if ( LIST[1] > 44 ) return LIST[1]; //LIST[1] = 74 , return 74; //傳後
2. if ( LIST[2] > 74) return LIST[2]; //LIST[2] = 546 , return 546; //傳後
3. if ( LIST[3] > 546 ) , 但 LIST[3] = 445 ; //傳LIST[3]之前最大的值,是546,然後讓546再和下一個66比,於是
4 if ( LIST[4] > 546 ) , 但 LIST[4] = 66; //傳LIST[4]之前最大的值還是546最大,於是傳回546,然後用5和後面

再用力思考一下吧,應該會了解的!


===================引 用 文 章===================

if (LIST[n] > max(LIST,n - 1)) 程序開始應該是一直遞歸max(LIST,n - 1)) 當 n == 0 時候 return LIST[0] , 相當於 return 44 ,

之後返回
1. if ( LIST[1] > 44 ) return LIST[1]; //LIST[1] = 74 , return 74;
2. if ( LIST[2] > 74) return LIST[2]; //LIST[2] = 546 , return 546;
3. if ( LIST[3] > 546 ) , 但 LIST[3] = 445 ;

之後else return max(LIST,n - 1); 用意何在我這搞不懂之後的變化?

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-09-17 23:42:37 IP:59.104.xxx.xxx 訂閱

謝謝你

使用print n 的stack變化 紙筆畫stack n 值...

不過遞迴真的不好思考@@ , 下次遇到類似的我怕我也想不出來@@ ...

謝謝

系統時間:2024-05-13 12:22:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!