递归的使用(图解)

递归:”":传递,“”:回归。

简单的解释:方法内调用它本身。

传递和回归必须存在一个临界点:比如最内层被调用的方法内给了一个返回值,或者是最内存被调用方法结束,然后将结果返回给上一层的方法.,然后一层层结束,一层层返回。

它的使用场景,比如会用递归来解决斐波那契数列、阶乘。。的问题。

例子:给一个整数n:求1+2+3+.....+n的值


首先是执行main()方法,main()方法进栈,然后调用main()方法中的add(5)方法,add(5)方法进栈。当执行到return add(4)+5时,add(5)方法会调用add(4)方法,add(4)方法进展,然后依次递归调用,直到add(1)方法进栈为止。

当执行add(1)方法时,会首先进行判断if(n==1),然后满足条件,该方法返回一个整数 1(临界点),(这个返回值是返回给add(2)方法的),然后add(1)方法执行完毕,出栈。



此时add(2)方法接收了add(1)方法的返回值,执行add(2)方法,最后走到return add(1)+2==return 1+2  ,add(2)方法执行完毕,将返回值返回给add(3)方法,出栈。

然后依次执行add(3)、add(4)、add(5)。。依次出栈。具体步骤看下图:


add(5)方法接受到前几个递归方法执行完毕后传来的值:1+2+3+4,执行它本身,return add(4)+5==return 1+2+3+4+5,将该结果返回给main()方法,add(5)出栈。递归结束


main()方法接受到了add(5)方法返回值,15,打印输出,main()方法结束,出栈。

### 递归实现二叉树的图解教程 递归是一种强大的编程技术,尤其适用于处理具有层次结构的数据类型,比如二叉树。以下是关于如何通过递归方法构建和遍历二叉树的具体解释。 #### 构建二叉树 构建二叉树的过程可以通过递归来完成。假设输入是一个数组形式的前序序列,其中`'#'`表示空节点,则可以按照以下方式创建一棵二叉树: ```c BTNode* BinaryTreeCreate(BTDataType* a, int* pi) { if (a[*pi] == '#') { return NULL; } BTNode* root = (BTNode*)malloc(sizeof(BTNode)); root->val = a[*pi]; (*pi)++; root->left = BinaryTreeCreate(a, pi); root->right = BinaryTreeCreate(a, pi); return root; } ``` 上述代码展示了如何利用递归函数逐步建立二叉树中的每一个节点[^4]。初始时指针指向数组的第一个元素,如果当前字符不是`'#'`,则分配内存并赋值给新节点,随后分别对其左右子树重复这一操作直到遇到终止符`'#'`为止。 #### 遍历二叉树 对于二叉树来说,常见的三种主要遍历方式分别是先序遍历(Pre-order Traversal),中序遍历(In-order Traversal)以及后序遍历(Post-order Traversal)。下面将以先序遍历为例展示其递归实现逻辑: ```c void PreOrderTraversal(struct TreeNode *root){ if(root != NULL){ printf("%d ", root->data); // 访问根节点数据 PreOrderTraversal(root->left); // 对左子树做同样的事情 PreOrderTraversal(root->right); // 接着对右子树执行相同的操作 } } ``` 此段程序片段清晰地体现了递归机制在二叉树上的应用——每次进入一个新的层之前都会优先打印该层的信息,然后再依次深入到更深层次去继续这个流程直至整个结构被完全探索完毕[^1]^。 另外还存在一种基于栈而非纯粹依赖递归调用的方式来达成同样效果的方法描述如下:使用显式的辅助数据结构即栈来保存待处理节点,在循环过程中不断弹出顶部元素进行相应动作的同时将其未访问过的子节点压回栈底等待后续处置[^2]^。 至于其他两种类型的遍历也可以采用类似的策略加以扩展实施。 ### 结论 综上所述,无论是构造还是遍历二叉树都可以借助递归手段高效简洁地解决问题,并且配合图形化演示能够帮助初学者更好地理解和掌握这些抽象的概念及其背后的运行机理。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值