递归调用
来源:互联网 发布:拓扑学 知乎 编辑:程序博客网 时间:2024/04/29 10:22
递归调用就是函数直接或间接的调用自身。调用自身就是指在一个函数的函数体中出现了对自身的调用语句。直接调用自身如:void fun(void) { ...; fun(); ...}。间接调用自身如:void fun1(void) { ...; fun2(); ...} void fun2(void) { ...; fun1(); ...},这里fun1调用了fun2,fun2又调用了fun1,这样就构成了递归。
递归调用就是将原有的问题分解成新的问题,而解决新问题时又用到了原有问题的解法。就这样循环分解下去,直到最终分解出来的问题是一个已知解的问题,这就是有限的递归调用,也才是有意义的,无限的递归调用永远也得不到解,没有实际意义。
递归调用有两个阶段,第一个阶段是递推,将原问题不断分解成新的子问题,逐渐向最终的解推进,最后达到已知的条件,也就是递归结束的条件,递推阶段就结束了。比如,计算4!,可以这样分解递推:
4!=4×3!→3!=3×2!→2!=2×1!→1!=1×0!→0!=1
未知------------------------------------------------->已知
第二个阶段是回归,从已知的条件出发,按照递推的逆过程,逐一求值回归,最后到达递推的开始处,结束回归完成递归调用。还看求4!的例子,回归阶段如下:
4!=4×3!=24←3!=3×2!=6←2!=2×1!=2←1!=1×0!=1←0!=1
未知----------------------------------------------------------------->已知
下面举个递归调用的例子:
分析:计算n!的公式是:n=0时,n!=1,n>0时,n!=n(n-1)!。这是一个递归形式的公式,编程求n!时采用递归算法,递归的结束条件是n=0。程序代码如下:
#include <iostream>
using namespace std;
long fac(int n)
{
long f;
if (n<0)
cout<<"n<0,data error!"<<endl;
else if (n==0)
f=1;
else
f=fac(n-1)*n;
return(f);
}
int main()
{
long fac(int n);
int n;
long y;
cout<<"Enter a positive integer:";
cin>>n;
y=fac(n);
cout<<n<<"!="<<y<<endl;
return 0;
}
运行结果:
Enter a positive integer:8
8!=40320
递归算法的效率不是很高,能用其他算法尽量用效率高的算法。
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- NetWorkHelper 检测网络状态
- cocos2dx quicxk 3.3 导入Json文件布局 UI
- android 分区系列处理
- centos6.5编译安装nginx1.6.2+mysql5.5.35+php5.2.17+Zendoptimizer+eaccelerator
- (转载)linux命令之十五tail命令
- 递归调用
- 《深入理解Python》读书笔记Ⅰ
- SWift开发实例之QQ登陆界面布局
- 玩转Protocol Buffers
- 深入理解Java:注解(Annotation)(一)——基本概念
- JAVA 语法 III - String类
- 开放源代码的CAD
- ViewPager onPageChangeListener
- *Leetcode - Merge k Sorted Lists