递归,一个基础而又前期难以理解的思想

递归思想的简单理解

最近在复习数据结构的时候,又去仔细了解了下 递归 的执行过程,特意在自己思路还较为清晰的时候记录下来

程序的顺序执行

首先要知道的是,函数递归调用并不会并发的创造一个新的程序去执行,而是在执行到函数递归调用语句的时候,跳入自己调用自己的循环,以二叉树的先序遍历为例。

void PreOrder(BTNode *b)
{
	if(b!=NULL){
		printf("%c", b->data);
		PreOrder(b->lchild);
		PreOrder(b->rchild);
	}
}

让我们来看这个函数的执行过程

  1. 判断指针*b指向的结点是否为空,当不为空则开始进行if语句的执行;
  2. 输出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中指针的双亲(函数的前一状态),这也算是简单的迭代了。

个人理解就是这么了,如果有所缺漏或者错误,敢请各位大佬指出,虚心改正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值