递归

递归

孤街醉人 提交于 2020-01-29 15:16:36
一、符合运用递归的条件: 能够将大问题进行分解为各个类似的小问题 各个小问题的解法类同与大问题 有问题终止的条件 二、递归代码的写法: 先推导出数学公式 找到终止条件 基于此写代码 三、递归代码注意事项: 警惕堆栈溢出: 因为不停的函数调用,建立方法栈,若无终止条件,或者超出栈内存,则会溢出 解决方案: 1)确立的正确终止条件 2)限制递归调用的深度,即建立调用深度计数器。 递归中函数值的重复计算: 如:f(4) 可能会被重复计算好几次 解决方案: 用散列表存储函数的值,在每次计算之前查询。 递归代码的调试方法: 因为对于规模较大,层次较深的递归代码,如果仅仅单步调试会非常麻烦困难。 解决方案: 1)日志输出每个阶段的值 2)结合条件断点进行调试 来源: CSDN 作者: alone away 链接: https://blog.csdn.net/quanzywy/article/details/104106355

递归算法:苹果放置问题

半腔热情 提交于 2020-01-29 12:23:55
问题描述: 把M个苹果放在N个盘子中,允许有盘子为空,共有多少种放置的方法。1.2.1和2.1.1是同样的放置方法。 输入: 第一行是测试数据的数目Num(0<=Num<=20)。以下每行均包含2个整数M和N,以空格分开。1<=M,N<=10。 输出: 对输入的每组数据M和N,用一行输出相应的K。 样例输入: 1 7 3 样例输出: 8 问题的思考及解决: 这题的思考模式和爬楼梯有点相似,也是类似于排列组合的问题,但是又不能用排列组合的思想来处理这个问题,需要用递归的思想来处理这个放置苹果的问题。 这个题目有3个需要考虑的问题点: 1)苹果和盘子数目的大小是否影响递归的思路 2)苹果和盘子如何进行递归求解摆放的数量 3)递归终止的条件 先从第一个问题考虑:当盘子数多于苹果数时,无论怎么放置,必然会有盘子多出来的。我们假设写个函数叫PlaceApple(m,n),返回值为放置的方法,那么当m<n时,有PlaceApple(m,n)=PlaceApple(m,m)。 那么如果m>n时,如何处理呢,此时我们会发现,在这种情况下,可能有盘子多出来,也可能没有盘子多出来。苹果放置的方法就为没有空盘子的情况和有空盘子的情况的总和,即为:PlaceApple(m,n)=PlaceApple(m, n - 1) + PlaceApple(m - n, n)。PlaceApple(m, n - 1

二叉树的非递归遍历

牧云@^-^@ 提交于 2020-01-29 04:41:47
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现 void preOrder1(BinTree *root) //递归前序遍历 { if(root!=NULL) { cout<<root->data<<" "; preOrder1(root->lchild); preOrder1(root->rchild); }} 2.非递归实现 根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下: 对于任一结点P: 1)访问结点P,并将结点P入栈; 2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P; 3

LeetCode 94/144/145: Binary Tree Inorder/Preorder/Postorder Traversal LeetCode

怎甘沉沦 提交于 2020-01-29 01:16:49
LeetCode 94 Inorder 问题描述 思路 中序遍历: 按照 左结点 根节点 右结点的顺序 递归实现 : preorder方法实现按照 左结点 根节点 右结点的顺序加入。以左结点为根的子树和 以右结点为根的子树 遍历也是由inorder方法实现。 非递归实现 :通过一个栈,从根节点开始入栈,如果当前结点不为空或者栈不为空,进入循环,只要一直存在左节点就一直入栈,不存在左节点就出栈访问当前结点,当前结点设置为出栈节点的右节点, 然后继续循环遍历 java实现 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ // //way1递归 // class Solution { // List<Integer> result=new ArrayList<Integer>(); // public List<Integer> inorderTraversal(TreeNode root) { // inorder(root); // return result; // } // private void inorder

Oracle 递归查询 (start with ...connect by ...prior)

不羁岁月 提交于 2020-01-28 22:53:55
1、connect by 是结构化查询中用到的,其基本语法是: select … from tablename start with 条件1 connect by 条件2 where 条件3; 例: select * from table start with org_id = ‘HBHqfWGWPy’ connect by prior org_id = parent_id; 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段: org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。 用上述语法的查询可以取得这棵树的所有记录。 其中: 条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。 条件2 是连接条件,其中用 PRIOR表示上一条记录 ,比如 CONNECT BY PRIOR org_id = parent_id ;就是说 上一条记录的org_id 是本条记录的parent_id ,即本记录的父亲是上一条记录。 例子中表示:从org_id的值为HBHqfWGWPy的这条记录开始查询,将该条记录的org_id 等于即将查询记录的 parent_id的所有记录查询出来,即查询org_id的值为HBHqfWGWPy这条记录的所有子节点。 条件3 是过滤条件,用于对返回的所有记录进行过滤。 2

递归组件、依赖注入、$refs、provide、inject的用法

安稳与你 提交于 2020-01-28 13:45:15
递归组件、依赖注入、$refs、provide、inject的用法 $root 用来访问根组件 $parent 用来从一个子组件访问父组件的实例 ref 和 $refs 的用法 在组件上面使用 ref 这个属性绑定,属性值自取,然后就可以通过 $refs.属性名 这种方式去获取到指定组件的实例了。 其实不仅仅是组件能够使用 ref ,标签元素也能使用。 依赖注入 现在我们有一个需求,如果我们存在多个组件嵌套的,然后现在其中某一个组件想访问其曾祖父组件的方法,那么使用上面两种方式都是不可取的,这个时候官方提供了 provide 和 inject 这两个属性来解决这个问题。 provide 允许我们指定想要提供给后代组件的数据/方法,且该属性是一个方法,返回一个对象,键名就是我们要传到后代组件的标志 然后在任何后代组件里,我们都可以使用 inject 选项来接收指定的我们想要添加在这个实例上的属性。该属性是一个数组类型,跟 props 的数组语法类似 说到这里,有的人可能会觉得这不就是跟 props 差不多嘛。没错,它确实差不多,但是还是有区别的,比如,祖先元素不需要知道哪些后代组件使用它提供的属性;其次,后代组件也不需要知道被注入的属性来自哪里 代码如下: 父组件: < div id = " app " > < child-com > </ child-com > </ div >

10 - 递归

我们两清 提交于 2020-01-28 12:54:07
1. 一个应用场景 2. 概述 递归就是方法自己调用自己 递归需要遵守的重要规则 执行一个方法时,就创建一个新的受保护的独立空间(栈空间) 方法的局部变量是独立的,不会相互影响;但如果方法中使用的是 引用类型变量 (比如数组),就会 共享 该引用类型的数据 递归必须向退出递归的条件逼近,即该函数所处理的数据规模必须在递减,否则就是无限递归,出现 StackOverflowError 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕 理解 - 方法调用 逻辑 内存 https://www.jianshu.com/p/e7a22923867f 3. 过程 当在一个函数运行期间,调用另一个函数时,在运行被调用函数之前,系统需要先完成3件事 将所有实参,返回地址等信息传递给被调用函数保存 为被调用函数的局部变量分配存储区 将控制转移到被调函数的入口 从被调用函数返回调用函数之前,系统也应完成3件工作 保存被调函数的计算结果 释放被调函数的数据区 依照被调函数保存的返回地址将控制转移到调用函数 当有多个函数构成嵌套调用时,按照"后调用先返回"的原则,上述函数之间的信息传递和控制转移必须通过"栈"来实现,即系统将整个程序运行时所需的数据空间安排在一个栈中,每当调用一个函数,就为它在栈顶分配一个存储区

程序员必须掌握的核心算法有哪些?

痴心易碎 提交于 2020-01-28 11:09:35
原文地址: https://blog.csdn.net/m0_37907797/article/details/102661778 由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。 一、算法最最基础 1、时间复杂度 2、空间复杂度 一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必须最先学的,主要有最大复杂度、平均复杂度等,直接通过博客搜索学习即可。 文章推荐: 算法分析神器—时间复杂度 二、基础数据结构 1、线性表 列表(必学) 链表(必学) 跳跃表(知道原理,应用,最后自己实现一遍) 并查集(建议结合刷题学习) 不用说,链表、列表必须,不过重点是链表。 三分钟基础数据结构:如何轻松手写链表? 以后有面试官问你「跳跃表」,你就把这篇文章扔给他 2、栈与队列 栈(必学) 队列(必学) 优先队列、堆(必学) 多级反馈队列(原理与应用) 特别是优先队列

【数据结构与算法】二叉树的遍历

让人想犯罪 __ 提交于 2020-01-28 09:52:48
前序遍历是指,对于树中的任意节点来说,先打印这个节点,然后再打印它的左子树,最后打印它的右子树。 中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它本身,最后打印它的右子树。 后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它的右子树,最后打印这个节点本身。 层次遍历是指,对树中的节点一层一层的打印,其实就是广度优先算法(BFS)。 一、前序遍历 LeetCode: https://leetcode-cn.com/problems/binary-tree-preorder-traversal/ C语言代码实现: 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * struct TreeNode *left; 6 * struct TreeNode *right; 7 * }; 8 */ 9 10 11 /** 12 * Note: The returned array must be malloced, assume caller calls free(). 13 */ 14 15 /* 获取树的节点个数 */ 16 int getTreeNodeLen(struct TreeNode* root) 17 { 18 if (root

oracle中 connect by prior 递归算法

半腔热情 提交于 2020-01-28 05:05:53
Oracle中start with...connect by prior子句使用方法 connect by 是结构化查询中用到的,其基本的语法是: select ... from tablename start with 条件1 connect by 条件2 where 条件3; 例: select * from table start with org_id = 'HBHqfWGWPy' connect by prior org_id = parent_id; 简单说来是将一个树状结构存储在一张表里,比方一个表中存在两个字段: org_id,parent_id那么通过表示每一条记录的parent是谁,就能够形成一个树状结构。 用上述语法的查询能够取得这棵树的全部记录。 当中: 条件1 是根结点的限定语句,当然能够放宽限定条件,以取得多个根结点,实际就是多棵树。 条件2 是连接条件,当中用PRIOR表示上一条记录,比方 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。 条件3 是过滤条件,用于对返回的全部记录进行过滤。 简介例如以下: 早扫描树结构表时,须要依此訪问树结构的每一个节点,一个节点仅仅能訪问一次,其訪问的过程例如以下: 第一步:从根节点開始; 第二步