亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++函數的嵌套調用和遞歸調用學習教程

2020-05-23 14:15:25
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了C++函數的嵌套調用和遞歸調用學習教程,是C++入門學習中的基礎知識,需要的朋友可以參考下

C++函數的嵌套調用

C++不允許對函數作嵌套定義,也就是說在一個函數中不能完整地包含另一個函數。在一個程序中每一個函數的定義都是互相平行和獨立的。

雖然C++不能嵌套定義函數,但可以嵌套調用函數,也就是說,在調用一個函數的過程中,又調用另一個函數。

在程序中實現函數嵌套調用時,需要注意的是:在調用函數之前,需要對每一個被調用的函數作聲明(除非定義在前,調用在后)。

【例】用弦截法求方程f(x)=x3-5x2+16x-80=0的根。

這是一個數值求解問題,需要先分析用弦截法求根的算法。根據數學知識,可以列出以下的解題步驟:

1) 取兩個不同點x1,x2,如果f(x1)和f(x2)符號相反,則(x1,x2)區間內必有一個根。如果f(x1)與f(x2)同符號,則應改變x1,x2,直到f(x1), f(x2)異號為止。注意x1?x2的值不應差太大,以保證(x1,x2)區間內只有一個根。

2) 連接(x1, f(x1))和(x2, f(x2))兩點,此線(即弦)交x軸于x,見圖。

C++函數的嵌套調用和遞歸調用學習教程

x點坐標可用下式求出:

C++函數的嵌套調用和遞歸調用學習教程

再從x求出f(x)。

3) 若f(x)與f(x1)同符號,則根必在(x, x2)區間內,此時將x作為新的x1。如果f(x)與f(x2)同符號,則表示根在( x1,x)區間內,將x作為新的x2。

4) 重復步驟 (2) 和 (3), 直到 |f(x)|<ξ為止, ξ為一個很小的正數, 例如10-6。此時認為 f(x)≈0。

這就是弦截法的算法,在程序中分別用以下幾個函數來實現以上有關部分功能:

1) 用函數f(x)代表x的函數:x3-5x2+16x-80。

2) 用函數xpoint (x1,x2)來求(x1,f(x1))和(x2,f(x2))的連線與x軸的交點x的坐標。

3) 用函數root(x1,x2)來求(x1,x2)區間的那個實根。顯然,執行root函數的過程中要用到xpoint函數,而執行xpoint函數的過程中要用到f函數。

根據以上算法,可以編寫出下面的程序:

 

 
  1. #include <iostream> 
  2. #include <iomanip> 
  3. #include <cmath> 
  4. using namespace std; 
  5. double f(double); //函數聲明 
  6. double xpoint(doubledouble); //函數聲明 
  7. double root(doubledouble); //函數聲明 
  8. int main( ) 
  9. double x1,x2,f1,f2,x; 
  10. do 
  11. cout<<"input x1,x2:"
  12. cin>>x1>>x2; 
  13. f1=f(x1); 
  14. f2=f(x2); 
  15. while(f1*f2>=0); 
  16. x=root(x1,x2); 
  17. cout<<setiosflags(ios::fixed)<<setprecision(7); 
  18. //指定輸出7位小數 
  19. cout<<"A root of equation is "<<x<<endl; 
  20. return 0; 
  21. double f(double x) //定義f函數,以實現f(x) 
  22. double y; 
  23. y=x*x*x-5*x*x+16*x-80; 
  24. return y; 
  25. double xpoint(double x1, double x2) //定義xpoint函數,求出弦與x軸交點 
  26. double y; 
  27. y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1)); //在xpoint函數中調用f函數 
  28. return y; 
  29. double root(double x1, double x2) //定義root函數,求近似根 
  30. double x,y,y1; 
  31. y1=f(x1); 
  32. do 
  33. x=xpoint(x1,x2); //在root函數中調用xpoint函數 
  34. y=f(x); //在root函數中調用f函數 
  35. if (y*y1>0) 
  36. y1=y; 
  37. x1=x; 
  38. else 
  39. x2=x; 
  40. }while(fabs(y)>=0.00001); 
  41. return x; 

運行情況如下:

 

 
  1. input x1, x2:2.5 6.7↙ 
  2. A root of equation is 5.0000000 

對程序的說明:

1) 在定義函數時,函數名為f,xpoint和root的3個函數是互相獨立的,并不互相從屬。這3個函數均定為雙精度型。

2) 3個函數的定義均出現在main函數之后,因此在main函數的前面對這3個函數作聲明。

習慣上把本程序中用到的所有函數集中放在最前面聲明。

3) 程序從main函數開始執行。

4) 在root函數中要用到求絕對值的函數fabs,它是對雙精度數求絕對值的系統函數。它屬于數學函數庫,故在文件開頭用#include 把有關的頭文件包含進來。

C++函數的遞歸調用

在調用一個函數的過程中又出現直接或間接地調用該函數本身,稱為函數的遞歸(recursive)調用。C++允許函數的遞歸調用。例如:

 

 
  1. int f(int x) 
  2. int y, z; 
  3. z=f(y); //在調用函數f的過程中,又要調用f函數 
  4. return (2*z); 

以上是直接調用本函數,見下面的圖。

下圖表示的是間接調用本函數。在調用f1函數過程中要調用f2函數,而在調用f2函數過程中又要調用f1函數。

C++函數的嵌套調用和遞歸調用學習教程

從圖上可以看到,這兩種遞歸調用都是無終止的自身調用。顯然,程序中不應出現這種無終止的遞歸調用,而只應出現有限次數的、有終止的遞歸調用,這可以用if語句來控制,只有在某一條件成立時才繼續執行遞歸調用,否則就不再繼續。

包含遞歸調用的函數稱為遞歸函數。

【例】有5個人坐在一起,問第5個人多少歲?他說比第4個人大兩歲。問第4個人歲數,他說比第3個人大兩歲。問第3個人,又說比第2個人大兩歲。問第2個人,說比第1個人大兩歲。最后問第1個人,他說是10歲。請問第5個人多大?

每一個人的年齡都比其前1個人的年齡大兩歲。即:

 

 
  1. age(5)=age(4)+2 
  2. age(4)=age(3)+2 
  3. age(3)=age(2)+2 
  4. age(2)=age(1)+2 
  5. age(1)=10 

可以用式子表述如下:

 

 
  1. age(n)=10 (n=1) 
  2. age(n)=age(n-1)+2 (n>1) 

可以看到,當n>1時,求第n個人的年齡的公式是相同的。因此可以用一個函數表示上述關系。圖4.11表示求第5個人年齡的過程。

C++函數的嵌套調用和遞歸調用學習教程

可以寫出以下C++程序,其中的age函數用來實現上述遞歸過程。

 

 
  1. #include <iostream> 
  2. using namespace std; 
  3. int age(int);//函數聲明 
  4. int main( )//主函數 
  5. cout<<age(5)<<endl; 
  6. return 0; 
  7. int age(int n)//求年齡的遞歸函數 
  8. int c; //用c作為存放年齡的變量 
  9. if(n==1) c=10; //當n=1時,年齡為10 
  10. else c=age(n-1)+2; //當n>1時,此人年齡是他前一個人的年齡加2 
  11. return c; //將年齡值帶回主函數 

運行結果如下:

  1.  


【例】用遞歸方法求n!。

求n!可以用遞推方法,即從1開始,乘2,再乘3……一直乘到n。求n!也可以用遞歸方法,即5!=4!×5,而4!=3!×4,…,1!=1??捎孟旅娴倪f歸公式表示:

 

 
  1. n! = 1 (n=0, 1) 
  2. n * (n-1)! (n>1) 

有了例4.10的基礎,很容易寫出本題的程序:

 

 
  1. #include <iostream> 
  2. using namespace std; 
  3. long fac(int);//函數聲明 
  4. int main( ) 
  5. int n;//n為需要求階乘的整數 
  6. long y; //y為存放n!的變量 
  7. cout<<"please input an integer :"//輸入的提示 
  8. cin>>n; //輸入n 
  9. y=fac(n);//調用fac函數以求n! 
  10. cout<<n<<"!="<<y<<endl; //輸出n!的值 
  11. return 0; 
  12. long fac(int n) //遞歸函數 
  13. long f; 
  14. if(n<0) 
  15. cout<<"n<0,data error!"<<endl; //如果輸入負數,報錯并以-1作為返回值 
  16. f=-1; 
  17. else if (n==0||n==1) f=1; //0!和1!的值為1 
  18. else f=fac(n-1)*n;//n>1時,進行遞歸調用 
  19. return f;//將f的值作為函數值返回 

運行情況如下:

 

 
  1. please input an integer:10↙ 
  2. 10!=3628800 

許多問題既可以用遞歸方法來處理,也可以用非遞歸方法來處理。在實現遞歸時,在時間和空間上的開銷比較大,但符合人們的思路,程序容易理解。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品中文字幕在线| 久久亚洲精品中文字幕冲田杏梨| 日韩中文在线中文网三级| 欧美日本高清视频| 国产精品久久久亚洲| 九九精品视频在线| 成人午夜黄色影院| 久久艳片www.17c.com| 国产91精品最新在线播放| 国产精品成人久久久久| 亚州精品天堂中文字幕| 中文字幕精品视频| 久久久噜久噜久久综合| 国产精品人成电影| 日韩精品高清在线| 国产视频福利一区| 亚洲а∨天堂久久精品9966| 国产一区二区美女视频| 国产情人节一区| 亚洲综合精品一区二区| 狠狠综合久久av一区二区小说| 日韩av在线影院| 国产成人精品一区二区在线| 日韩精品视频在线| 8090理伦午夜在线电影| 中文字幕av一区二区| 在线视频一区二区| 26uuu久久噜噜噜噜| 国产精品网址在线| 国产精品欧美激情在线播放| 91精品啪aⅴ在线观看国产| 91久久久久久| 欧美色视频日本版| 亚洲色图激情小说| 国产在线久久久| 毛片精品免费在线观看| 亚洲第一视频网站| 伊人男人综合视频网| 国产高清在线不卡| 精品视频在线观看日韩| 精品夜色国产国偷在线| 欧美日韩国产精品专区| 亚洲视频一区二区| 色www亚洲国产张柏芝| 欧美激情亚洲自拍| 欧美黑人性生活视频| 97久久精品视频| 欧美日韩国产va另类| 国产精品稀缺呦系列在线| 久久精品久久久久久| 欧美日韩国产999| 亚洲免费一级电影| 国产视频精品一区二区三区| 美女精品视频一区| 欧洲亚洲妇女av| 日韩av在线免费看| 中文综合在线观看| 爱福利视频一区| 久久精品国产精品| 国产精品永久免费视频| 国产精品夫妻激情| 日韩中文字在线| 国产精品www| 国产91精品不卡视频| 亚洲福利视频专区| 国产精品爽黄69天堂a| 欧美性在线观看| 国产亚洲欧美日韩美女| 日本久久久久亚洲中字幕| 精品久久久久久中文字幕| 亚洲精品网站在线播放gif| 狠狠躁夜夜躁人人躁婷婷91| 精品少妇一区二区30p| 日韩国产精品亚洲а∨天堂免| 亚洲国产精品一区二区三区| 欧美日韩久久久久| 日本伊人精品一区二区三区介绍| 亚洲国产精品成人av| 一区二区三区黄色| 日韩中文在线观看| 国产成人精品国内自产拍免费看| 国产欧美va欧美va香蕉在线| 97精品伊人久久久大香线蕉| 亚洲美女动态图120秒| 国产精品视频999| 欧美午夜宅男影院在线观看| 欧美日韩免费网站| 欧美日韩中文字幕在线| 亚洲国产成人av在线| 欧美日韩国产91| 激情成人中文字幕| 隔壁老王国产在线精品| 中文字幕国产精品久久| 成人国产在线视频| 欧美—级a级欧美特级ar全黄| 亚洲人成在线一二| 97国产精品人人爽人人做| 精品自在线视频| 疯狂做受xxxx高潮欧美日本| 羞羞色国产精品| 91社区国产高清| 一区二区欧美亚洲| 国产精品中文久久久久久久| www.国产一区| 久久久国产一区二区三区| 91国内在线视频| 久久精品91久久久久久再现| 久久91亚洲人成电影网站| 欧美高跟鞋交xxxxxhd| 欧美日本精品在线| 色综合视频一区中文字幕| 久久久久久久久久久成人| 在线视频免费一区二区| 亚洲黄色www网站| 欧洲亚洲免费在线| 国产成人小视频在线观看| 日韩在线视频导航| 97香蕉超级碰碰久久免费的优势| 国产日韩在线精品av| 欧美性xxxx极品高清hd直播| yellow中文字幕久久| 亚洲一级黄色片| 97香蕉超级碰碰久久免费的优势| 性色av一区二区咪爱| 亚洲欧美日韩爽爽影院| 日韩国产欧美精品在线| 欧美一级电影在线| 日韩在线免费高清视频| 欧美国产日韩一区二区三区| 日韩经典中文字幕在线观看| 国产一区二区三区在线观看网站| 日韩精品视频免费专区在线播放| 亚洲的天堂在线中文字幕| 国产精品专区h在线观看| 亚洲精品在线观看www| 中文字幕无线精品亚洲乱码一区| 中文字幕亚洲欧美日韩在线不卡| 久久人人看视频| 亚洲一区www| www.精品av.com| 美女999久久久精品视频| 色婷婷**av毛片一区| 亚洲毛茸茸少妇高潮呻吟| 久久久久九九九九| 欧美日韩福利视频| 国产欧美va欧美va香蕉在| 永久免费精品影视网站| 欧美床上激情在线观看| 久久综合色88| 精品国模在线视频| 久久韩剧网电视剧| 亚洲va欧美va国产综合剧情| 久久久久久中文字幕| 中文字幕亚洲综合久久| 欧美激情在线狂野欧美精品| 国产精品一区二区三区毛片淫片| 日韩欧亚中文在线| 免费97视频在线精品国自产拍| 亚洲第一视频网| 国产精品视频久久久久| 亚洲aⅴ日韩av电影在线观看| 国产97人人超碰caoprom| 日韩av大片免费看| 成人97在线观看视频|