這是一個遞歸的處理
饒陽網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),饒陽網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為饒陽1000多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的饒陽做網(wǎng)站的公司定做!
遞歸是使用棧實現(xiàn)的,下面仔細的分析一下壓棧、退棧的情況
x=try(5);
調(diào)用try函數(shù),進入try函數(shù)開始遞歸處理。
try(5)
當前n=5,if ( n0 )成立,進入if分支:
return ( n * try (n-2) );
也就是return ( 5 * try(3) );
當前棧中的情況:
5 --------棧底
try(3)
當前n=3,if ( n0 )成立,進入if分支:
return ( n * try (n-2) );
也就是return ( 3 * try(1) );
當前棧中的情況:
3
5 --------棧底
try(1)
當前n=1,if ( n0 )成立,進入if分支:
return ( n * try (n-2) );
也就是return ( 1 * try(-1) );
當前棧中的情況:
1
3
5 --------棧底
try(-1)
當前n=-1,if ( n0 )不成立,進入else分支:
else return(1);
返回1.
當前棧中的情況:
1 --------棧頂
1
3
5 --------棧底
所以整個遞歸處理后,棧的情況如下:
1 --------棧頂
1
3
5 --------棧底
在try(-1)時,到達遞歸的出口,開始從棧頂退棧,
所以退找后的表達式為:
1*1*3*5=15
所以最后x等于15,輸出15
c#中通常使用try-catch語句來捕獲和處理異常。下面我們看看try-catch語句的使用語法。
try
{
可執(zhí)行語句塊;
}
catch
(
exception
e
)
{
異常處理語句;
throw;
}
1、try語句塊中放置可能存在異常的代碼塊。若執(zhí)行try語句塊時有異常發(fā)生,則程序拋出的異常,由catch語句捕獲;若try語句塊沒產(chǎn)生異常,程序會直接跳出try-catch語句。
2、catch語句塊緊跟在try語句塊后面,它可以捕獲try語句塊中拋出的異常。注意catch關(guān)鍵字后有一對小括號,小括號中需放置異常類參數(shù),參數(shù)名是可省略的。當try語句拋出異常時,拋出的異常類型會與catch語句中的異常類型進行匹配,若匹配成功,則執(zhí)行catch語句塊中的內(nèi)容。
3、exception是所有異常類的父類,它能和所有異常類匹配。前一小節(jié)拋出的indexoutofrangeexception異常類也是exception的子類。需注意的是:如果catch語句塊不帶參數(shù),那么catch語句也能捕獲所有異常。
4、throw關(guān)鍵字表示拋出一個異常,可省略。
同時try-catch語句通常和finally語句一起使用,具體的使用方法可以參考秒秒學網(wǎng)站講解異常的那一章,其實上面的內(nèi)容我也是從那里學來的。
try
{
//必須執(zhí)行的語句
}
catch()
{
//try里面出現(xiàn)異常則執(zhí)行這里
}
這句話一般用做程序拋出異常.防止程序出現(xiàn)卡死的情況.我們一般用此語句主要用在對數(shù)據(jù)庫的增刪改的敵方.畢竟這是最容易出錯的敵方.為了使程序提高性能,不崩潰的情況下.就是要使用這句語句.
C語言是沒有try語句的,還有,你這個地方也就算是一個函數(shù)(在C語言里面你寫的這個try只能是函數(shù))
有語法錯誤,幫你改了,你自己再看看
#includestdio.h
void try(int,int,int);
int main()
{
int x=2,y=3,z=0; //y=3
printf("(1)x=%d y=%d z=%d\n",x,y,z);
try(x,y,z);
printf("(4)x=%d y=%d z=%d\n",x,y,z);
}
void try(int x,int y,int z)
{
printf("(2)x=%d y=%d z=%d\n",x,y,z);
z=x+y;
x=x*x;
y=y*y;
printf("(3)x=%d y=%d z=%d\n",x,y,z);
}
一點補充:最開始我運行你這個程序是在一個.cpp文件里面寫的代碼,然后運行,但是程序會報錯,為什么呢?因為cpp一般而言是C++的文件,C++里面有try語句,try是他的一個關(guān)鍵字,所以函數(shù)名不能是關(guān)鍵字,程序報錯了。
但是在一個.c文件里面是沒有問題的~~
還有,你這個真心是一個函數(shù),不是try語句,try語句是
try
{
do something
}
catch(some error)
{
do something
}
try里面的是一個程序塊,你把可能發(fā)生異常的程序塊放到try中執(zhí)行,
如果真發(fā)生異常的話,try就把這個異常拋出,
這個拋出過程由throw進行,拋出異常后,
由緊跟在try塊后的
catch
接收并解決這個異常
try 語句可為一組語句指定異常處理器和/或清理代碼:
1.子句指定一個或多個異常處理程序。?當 try 子句中沒有發(fā)生異常時,沒有任何異常處理程序會被執(zhí)行。 當 try 子句中發(fā)生異常時,將啟動對異常處理程序的搜索。 此搜索會逐一檢查 except 子句直至找到與該異常相匹配的子句。 如果存在無表達式的 except 子句,它必須是最后一個;它將匹配任何異常。 對于帶有表達式的 except 子句,該表達式會被求值,如果結(jié)果對象與發(fā)生的異常“兼容”則該子句將匹配該異常。 如果一個對象是異常對象所屬的類或基類,或者是包含兼容該異常的項的元組則兩者就是兼容的。
2.如果沒有 except 子句與異常相匹配,則會在周邊代碼和發(fā)起調(diào)用棧上繼續(xù)搜索異常處理器。 1
3.如果在對 except 子句頭中的表達式求值時引發(fā)了異常,則原來對處理器的搜索會被取消,并在周邊代碼和調(diào)用棧上啟動對新異常的搜索(它會被視作是整個 try 語句所引發(fā)的異常)。
當找到一個匹配的 except 子句時,該異常將被賦值給該 except 子句在 as 關(guān)鍵字之后指定的目標,如果存在此關(guān)鍵字的話,并且該 except 子句體將被執(zhí)行。 所有 except 子句都必須有可執(zhí)行的子句體。 當?shù)竭_子句體的末尾時,通常會轉(zhuǎn)向整個 try 語句之后繼續(xù)執(zhí)行。 (這意味著如果對于同一異常存在有嵌套的兩個處理器,而異常發(fā)生于內(nèi)層處理器的 try 子句中,則外層處理器將不會處理該異常。)
4.當使用 as 將目標賦值為一個異常時,它將在 except 子句結(jié)束時被清除。 這就相當于
這意味著異常必須賦值給一個不同的名稱才能在 except 子句之后引用它。 異常會被清除是因為在附加了回溯信息的情況下,它們會形成堆棧幀的循環(huán)引用,使得所有局部變量保持存活直到發(fā)生下一次垃圾回收。
5.函數(shù)的返回值是由最后被執(zhí)行的 return 語句所決定的。?由于 finally 子句總是被執(zhí)行,因此在 finally 子句中被執(zhí)行的 return 語句總是最后被執(zhí)行的:
6.當找到一個匹配的 except 子句時,該異常將被賦值給該 except 子句在 as 關(guān)鍵字之后指定的目標,如果存在此關(guān)鍵字的話,并且該 except 子句體將被執(zhí)行。 所有 except 子句都必須有可執(zhí)行的子句體。 當?shù)竭_子句體的末尾時,通常會轉(zhuǎn)向整個 try 語句之后繼續(xù)執(zhí)行。 (這意味著如果對于同一異常存在有嵌套的兩個處理器,而異常發(fā)生于內(nèi)層處理器的 try 子句中,則外層處理器將不會處理該異常。)