函数递归就是函数自己调自己;
例 1:递归函数
int fun (int i) {
return fun (i);
}
例1就是一个递归,不过它是一个无终止的递归。正常编写的程序应该是有限次数的,有终止条件的递归。可以用 if else 语句作限制。
例2 递归函数求n的阶乘
int main()
{
int fun(int);
cout<<fun(3) <<endl;
return 0;
}
int fun (int n) {
int a=0;
if (n==1||n==0) {
return 1;
} else {
a= fun(n-1)*n;
}
return a;
}
递归之精髓 就在 a= fun(n-1)*n; 这一行。 程序执行流程 :
- main方法中调用fun函数,传入整数3.
- 执行 a= fun(n-1)*n语句中的fun(n-1),注意此时a没有赋值,fun(n-1)也没有乘上n。只是单纯的再次调用fun方法
- 第二次调用fun,传入的值是n-1,即fun(2)
- 整数2再次进入 a= fun(n-1)*n的fun(n-1),此时a依然没有赋值,fun(n-1)也没有乘上n,只在调用fun方法,此时n为2;
- 经由两次递归后传入fun的值变成了1,此时执行 return 1语句,这个return 1 并不是表示整个方法结束了,返回1到main函数。而是将1返回至第四步尚未执行 乘n 操作的fun(n-1)方法。 这样第四步调用的fun(-1)就有了具体的返回值 1,执行时体现为 a= 1* 2;**注:(fun(n-1)=1,n=2)**执行完后a第一次有了具体的值 2.
- a 的值变成2后,此时程序 第一次执行 最后一行的 return a; 语句,这个return a 同样也不是表示整个方法结束了,返回a到main函数。而是将a的值返回至第第二步还在等待 乘n 的fun(n-1)方法。此时 a = 2*3(fun(n-1)=2,传入的n=3)。
- 第六步执行完后 a=6,此时会再执行return a;语句,将a的值返回至main函数里调用的fun(3).
fun函数一共被调用三次,一次是main函数里调用 fun(3),还有两次fun函数自己调用的即fun(2),fun(1); 最重要的是要理解我们调用fun函数并不是立即得到返回值,而是再等待程序递归至最低级,最低级有了确定的返回值,再层层递推上级。fun(3)里调用fun(2),fun(3)就陷入等待,fun(2)里调用fun(1),fun(2)陷入等待。直至fun(1)返回了1,fun(2)才会继续执行,fun(2)执行完后,fun(3)才能继续执行。
|