C++函數二(函數的嵌套調用和遞歸調用)


函數的嵌套調用

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

所謂嵌套調用,是在調用一個函數並執行該函數的過程中,又調用另一個函數的情況如在main()函數中調用a函數,而在a函數的執行過程中又調用b函數這就構成了兩層嵌套調用,如圖所示:

 

根據函數的調用原則,被調用函數返回時(執行了return語句,或執行到函數的最后語句),一定是返回到調用它的函數(主調函數)的中斷位置,繼續執行主調函數后面的語句。

【實例】

#include<iostream>

using namespace std;

  int func2(int x)

{

int t;

t = x + 9;

return (t);

}

  int func1(int a, int b)

{

int z;

z = func2(a*b);

return(z);

}

int main() {

int x1 = 2, x2 = 5, y;

y = func1(x1, x2);

cout << y << endl;

system("pause");

return 0;

}

 函數的遞歸調用

1.遞歸調用

函數的遞歸調用:在調用一個函數的過程中又出現直接或間接地調用該函數本身,稱為函數的遞歸調用

double f(double x)
double y;

y=f(x);
return y*y;

這里,在f函數的內部,又調用了f函數,這是直接調用本函數。如果在調用f1函數過程中要調用f2函數,而在調用f2函數過程中又要調用f1函數,這是間接調用本函數。

遞歸調用都是無終止地調用自己。程序中不應該出現這種無止的遞歸調用,而應該為有限次數、有終止的遞歸調用。這可以使用if語句來控制,當滿某一條件時讓遞歸調用結束。

實例從鍵盤輸入一個整數,求該數的階乘

根據求一個數n的階乘的定義n!=n(n-1),可寫成如下形式:
f(n)=1  (n=1)

Fac(n)=n*fac(n-1)  (n>1)

#include<iostream>
using namespace std;
long fac(int n)
{
    long p;
    if (n == 1) p = 1;
    else p = n * fac(n - 1);
    return p;
}
int main (){
    int n;
    cout << "輸入一個正整數";
        cin >> n;
        cout << n << "!=" << fac(n)<< endl;
        system("pause");
     return 0;
}

2. 遞歸調用的執行過程(遞歸的深入理解)

遞歸調用的執行過程分為遞推過程和回歸過程兩部分。這兩個過程由遞歸終止條件控制,即逐層遞推,直至到達遞歸終止條件,然后逐層回歸。遞歸調用與普通的函數調,利用了先進后出的棧結構來實現。每次調用時,在棧中分配內存單元,保存返回地址以及參數和部變量而與普通的函數調用不同的是,由於遞推的過程是一個逐層調用的過程,因此存在一個逐層連續的參數入棧過程,調用過程每調用一次自身,把當前參數壓棧,每次調用時都首先判斷遞歸終止條件,直至達到遞歸終止條件為止;接着回歸過程不斷從棧中彈出當前的參數,直到棧空返回到初始調用處為止


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM