递归思想的简单理解
最近在复习数据结构的时候,又去仔细了解了下 递归 的执行过程,特意在自己思路还较为清晰的时候记录下来
程序的顺序执行
首先要知道的是,函数递归调用并不会并发的创造一个新的程序去执行,而是在执行到函数递归调用语句的时候,跳入自己调用自己的循环,以二叉树的先序遍历为例。
void PreOrder(BTNode *b)
{
if(b!=NULL){
printf("%c", b->data);
PreOrder(b->lchild);
PreOrder(b->rchild);
}
}
让我们来看这个函数的执行过程
- 判断指针*b指向的结点是否为空,当不为空则开始进行if语句的执行;
- 输出b的内容;
接下来就关键了!
当函数执行PreOrder(b->lchild)语句的时候,函数开始调用PreOrder(BTNode *b)函数,接着执行PreOrder(b->lchild)函数的代码,待PreOrder(b->lchild)函数中的代码执行完毕后,才会继续执行PreOrder(b->rchild)语句-------也就是最初的函数的下一条语句
或者以另一种极端的方式理解,也就是函数调用的本质。函数A调用函数B,就是将参数更改,COPY一份函数B的代码放在A的下一部分代码中,当执行完COPY的代码段(PreOrder(b->lchild))后,也会顺序执行A原本的下一部分代码(PreOrder(b->rchild))。
所谓的递归调用不成立后,为什么要返回上一层递归。就是因为在原函数A中,b所指的内容并没有变化,递归调用是,传入的指针内容是A中指针所指向结点的孩子结点(递归调用的下一状态),而他仍然是递归调用函数中指针所指向的节点的双亲结点(函数的前一状态),所以当函数B递归调用不成立(也就是函数B执行完毕后),自然要回到原函数A中继续执行下一条语句,而原函数A中的指针所指向的是B中指针的双亲(函数的前一状态),这也算是简单的迭代了。
个人理解就是这么了,如果有所缺漏或者错误,敢请各位大佬指出,虚心改正!