递归过程中语句执行顺序
遞歸的兩種模式
模式一
//遞歸的過程中在"遞"的過程中解決問題 function function_name(Max_argument){if(end_condition){end;}else{solve;function_name(Min_argument);//問題規(guī)模逐漸減小} }注:位于遞歸函數(shù)前的語句和函數(shù)具有順序性
模式二
//遞歸的過程中在"歸"的過程中解決問題 function function_name(Max_argument){if(end_condition){end;}else{function_name(Min_argument);//問題規(guī)模逐漸減小solve;} }注:位于遞歸函數(shù)后的語句的執(zhí)行順序與原順序相反;
每一級的遞歸調(diào)用都擁有自己當前的局部變量,所以當調(diào)用對象的時候應(yīng)該注意是調(diào)用對象的非引用(復制對象), 以避免修改子對象造成對主問題的影響
調(diào)用棧
調(diào)用棧:描述函數(shù)之間的調(diào)用關(guān)系,當函數(shù)之間相互調(diào)用的時候會使用調(diào)用棧;
調(diào)用棧由多個棧幀組成,每個棧幀記錄著一個未運行完的函數(shù); 棧幀中保存著該函數(shù)的返回地址以及局部變量;
在遞歸中,遞歸函數(shù)的每一次的”遞進去”,棧幀都會將上個函數(shù)的返回地址局部變量保存以便在返回的過程中找得到相應(yīng)的”回歸出來的方向”
通過一個簡單的例子說明上述調(diào)用順序問題
//10進制轉(zhuǎn)2進制 void f(int n){if(n==0)return;printf("%d",n%2);//模式1,該模式下輸出語句將會是順序調(diào)用f(n/2) } //n=4,將輸出001,整個過程中先調(diào)用printf語句,然后"遞進去",通過棧幀進行回歸操作最終返回至main函數(shù)void f(int n){if(n==0)return;f(n/2)printf("%d",n%2) //模式2,整個過程中先執(zhí)行f 函數(shù)進行遞歸,到達遞歸基時返回執(zhí)行printf //整個過程中就是通過棧幀來記錄返回過程應(yīng)該執(zhí)行的printf,形成"回歸出來"解決問題,最終返回至main函數(shù) //n=4,輸出100 }接下來將用斐波那契查找作為典型的例子證明尾遞歸的重要性:
看下面的一個錯誤的例子:
針對上述的操作進行修改
//斐波那契查找 /* #include<iostream> using namespace std; int f[]={0,1,1,2,3,5,8,13,21,34}; // 0 1 2 3 4 5 6 7 8 9 10 int find(int a[],int lo,int hi,int e){int k=0;while((hi-lo)>f[k]) {//斐波那契數(shù)列確定當前的黃金分割點k++;// cout<<"k"<<k<<endl;} int mid=lo+f[k-2]-1;//在中點求值出現(xiàn)錯誤,未正確表示中點位置 // int mid=(lo+hi)>>1; if(lo>=hi) {return 0;}//未命中目標if(e==a[mid]) return mid;if(e<a[mid]) {return find(a,lo,mid-1,e);}if(e>a[mid]) {return find(a,mid+1,hi,e);} } int main(){//0,1,2,3,4,5,6,7,8,9 ,10,11,12,13,14,15,16,17 int a[]={1,2,3,4,5,6,7,8,9};cout<<find(a,0,9,8);return 0; }遞歸過程調(diào)用棧的使用與調(diào)用其他函數(shù)沒有區(qū)別,每一次的函數(shù)調(diào)用將會形成新的棧幀以保存上一次函數(shù)的返回地址和局部變量, 當棧幀中函數(shù)體執(zhí)行完成時將會刪除棧幀,處理返回值并修改當前代碼行
來自別人的話_很贊同__遞歸函數(shù)盡量不要有返回值或者基本類型的返回值(直接尾遞歸),如果要求必須有復雜類型返回值,寫成兩個函數(shù),遞歸函數(shù)不要有返回值,只是在函數(shù)中改變復雜類型的值;在驅(qū)動程序中定義復雜類型,調(diào)用遞歸函數(shù)返回復雜類型
總結(jié)
以上是生活随笔為你收集整理的递归过程中语句执行顺序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生成step文件_利用opencv给彦女
- 下一篇: 深度ip转换器手机版app_手机大师智能