递归:
- 递归函数:指在一个函数直接或间接出现对自身的引用,就是递归函数。
- 递归注意事项
1.必须要有边界条件
2.递归调用的参数必须向边界靠拢
3.必需有一个参数控制边界
- 让我们用一个样例来深刻理解一下
阶乘(水题):
-
6!=1 *2 *3 *4 *5 *6("!"是阶乘的符号)
-
1.这题其实可以用一个循环就能A;
int sum=1,n; for(int i=1;i<=n;i++){ sum*=i; } cout<<sum;//没有算法,自行理解
-
2.这个题也有递归的做法;
int factorial(int bn)//自定义函数 { if(bn==0) return 1;//边界条件 else return bn*factorial(bn-1);//调用参数向边界靠拢 } int main()//主函数 { int n; cout<<factorial(n);//调用函数 //bn是局部变量,n是全局变量。 }
-
两种方法都得出了720,
那么720到底是怎么得出的?函数都干了些什么?
看下图;
-
最左边是第几次循环,中间是每次函数调用的参数,就是上面的factorial(bn-1),最右边是返回值,前六个都是return bn*factorial(bn-1)而第七个则是边界,return 1;
-
说了这么多,就有人问了“既然循环可以,为什么还要用递归呢”。
回答只有两个字——简洁。
举个例子:如果这道题要求的是一下求好几个数的阶乘,递归函数可以大大减少代码量。 -
所以有一个技巧:简单题就用循环;复杂题看情况再用递归。