关于递归的 "结果集的收集" 与 "返回值向上传递"
以下总结完全是自我感觉, 目前遇到的几个题目会是这样的原型
1 如果我们只是想要收集递归中生成的每一个结果集, 就类似于遍历所有的节点, 然后每一个节点会对应一个值, 这样的形式的话, 递归函数的返回值设置为空即可, 但是我们需要准备一个容器, 或者作为递归函数的参 数依次传递下去, 或者设置成一个全局变量, 无论在哪都可以使用其引用
此种递归函数的参数: 所有子节点的原始父节点(即起始点), 收集所有节点数据的容器
此种函数的返回值: 一般返回值为空, 我们会用设置的容器收集所有的数据
刷LeetCode时, 这种需求的递归一般需要独立出一个函数, 因为我们需要传递一个容器作为参数,
2 如果我们使用递归函数只是用于获取一个最终的值, 这个递归的值是通过找到最底层的值, 然后通过直接上下级之间的特定关系进行运算出来的,
那么我们并不需要对每一个节点进行结果集的收集, 而是只需要确定终止条件下的返回值, 整个递归函数返回的是我们要求的节点的某个属性的上下级节点之间的关系
此种递归函数的参数: 属性的所属类, 即我们要求的"谁"的属性
此种递归函数的返回值: 返回的是我们要求的"属性"的上下级关系, 这也就直接确定了函数的返回值作为上一层遍历的某种运算
刷LeetCode时, 这种需求的递归一般不需要独立出一个函数,因为所需要的参数就是能够控制上下级之间关系的一个参数
在做LeetCode第257-二叉树的所有路径时, 突然发现, 这两种递归方式好像可以相互转换
第一种递归方式转成第二种递归方式: 要是转的话好像就很麻烦, 有点不太必要, 不过理论上可行, 但是就需要设置返回值之间需要以一种方式引用
第二种递归方式转成第一种递归方式: 只需要传递一个容器, 收集每一次遍历的独立结果集, 因为直接父子级之间的关系是确定的, 所以, 我们只需要将所有元素的独立结果集放入容器中, 最后遍历容器中的元素, 以直接父子级之间的联系进行连接即可
不过好像这只适用于一部分递归, 还有一部分可能不太适合
第257题, 根据题目需要传入了两个收集元素的容器, 这个递归方式扩展性极大.
关于递归函数, 除了递归三部曲, 还有很重要的一点就是, 我们传入的参数中, 一定要有一个能够控制递归向下进行传递的参数, 这个参数必定是在不同的直接父子级中具有相同的关系
举个栗子:
一般如果我们对二叉树类的数据进行递归的话, 传入的就是参数就是一个节点, 由于节点的特殊性, 我们可以获取一个节点的子节点作为下一层递归的传入参数, 这样就可以完成递归的向下传递
如果不是二叉树类的数据, 或者更加直接一点, 我们要求从1到10的和, 那么就需要传入一个int类型的参数, 这个参数的变化是从10到1, 这个参数控制的上下级关系就是 上级+1=下级
所以, 递归中两个最重要的关系:
一个是传递的参数必须要能够控制上下级关系
一个是我们必须要确定返回值的上下级之间的关系