采用递归算法解决的问题
定义是递归的
//阶乘的函数定义
long Fact(int n)
{
if(n==1) return 1;
else return n*Fact(n-1);
}
对于一类复杂的问题,能够分解成几个相对简单,解法相同或类似的子问题来求解,便称为递归求解。
这种分解-求解的策略叫“分治法”
- 能够通过转变将问题变成一个与原问题相类似的问题
- 通过分治法简化问题
- 必须有一个明确的递归出口
数据结构是递归的
链表就是一种递归的数据结构
遍历输出链表中各个结点的递归算法
void TraverseList(LinkList p)
{
if(p==NULL) return;
else
{
cout << p->data<<endl;
TraverseList(p->next);
}
}
广义表、二叉树也是典型的具有递归特性的数据结构
递归过程与递归的工作栈
两个函数相互调用时
调用前:
- 将所有的实参、返回地址、等信息传递给被调函数来保存
- 为被调函数的局部变量分配存储区
- 将控制转移到被调函数入口
调用后:
- 保存被调函数的计算结果
- 释放被调函数的数据区
- 依照被调函数的返回地址将控制转移到调用函数上
当有多个函数构成嵌套调用时,按照“后调用先返回”的原则,上述函数之间的信息传递和控制转移必须通过栈来实现,即系统将整个程序运行时所需要的数据空间安排在一个栈中,每次调用一个函数时,就为他在栈顶分配一个存储区,每当一个函数退出时,就释放它的存储区,则当前正运行的函数的数据必须在栈顶。
空间复杂度的分析
递归函数在执行时,系统需要设立一个递归工作栈,存储每一层递归所需要的信息,此工作栈是递归函数执行的辅助空间,分析空间复杂度时需要分析工作栈的大小。