函数执行过程:
1 在主程序中计算每个实际参数值;
2 用实际参数值初始化形式参数;
3 依次执行函数体的每个语句,直到遇见return语句或函数体结束;
4 计算return后面的表达式的值,用表达式的值构造一个临时变量;
5 回到调用函数,用临时变量置换函数调用,继续主程序的执行;
递归函数构成自我调用,直到递归出口条件:
#include<iostream> using namespace std; int i=0;//记录递推顺序; int j=0;//记录回归调用顺序; long fac(int n) { long sum=0; ++i; cout<<"递推:"<<i<<endl; if (n == 0) return 1; else sum = n * fac(n-1); ++j; //返回的临时值代替函数调用 cout<<"回归:"<<j<<endl; return sum; } int main() { cout<<fac(3)<<endl; system("pause"); } /* 递推:1 递推:2 递推:3 递推:4 回归:1 回归:2 回归:3 6 */
递推了4次(自调用前的代码执行了4次),回归3次(基线条件回归,自调用后的代码执行了3次)。
函数调用fac(3),相当于此代码重复了4次:
从以上递推、回归过程可见,递推、回归过程执行函数的代码段是不一样的,递推过程执行自调用函数之前的代码,达到基线回归条件后的第一次回归,直接return一个常量或常量表达式的值(不会再执行return后面的代码),此后的回归过程调用自调用函数之后的代码。
-End-