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