递归调用

递归和快速排序

感情迁移 提交于 2020-01-22 05:48:59
文章目录 递归 问题描述 基线条件和递归条件 栈 调用栈 递归调用栈 小结 快速排序 示例1 问题描述 欧几里得算法 使用D&C解决问题的两个步骤: 示例2 快速排序 工作原理 代码 小结 递归 问题描述 假设你在祖母的阁楼中翻箱倒柜,发现了一个上锁的神秘手提箱。祖母告诉你,钥匙很可能在下面这个盒子里,这个盒子里有盒子,而盒子里的盒子又有盒子。钥匙就在某个盒子中。为找到钥匙,你将使用什么算法? 方法一: 创建一个要查找的盒子堆。 从盒子堆取出一个盒子,在里面找。 如果找到的是盒子,就将其加入盒子堆中,以便以后再查找。 如果找到钥匙,则大功告成! 回到第二步。 方法二: 检查盒子中的每样东西。 如果是盒子,就回到第一步。 如果是钥匙,就大功告成! 第一种方法使用的是while循环:只要盒子堆不空,就从中取一个盒子,并在其中仔细查找。 def look_for_key ( main_box ) : pile = main_box . make_a_pile_to_look_through ( ) while pile is not empty : box = pile . grab_a_box ( ) for item in box : if item . is_a_box ( ) : pile . append ( item ) elif item . is_a_key ( ) :

Haskell 笔记 (五) 递归

余生长醉 提交于 2020-01-22 01:48:00
haskell 递归 递归 就是将问题展开为同样的子问题,并不断的对子问题展开,直到抵达问题的基准条件为止。 递归2个要点: 问题如何展开为子问题 定义基准条件 在程序上,问题的展开表现就是函数调用函数自己。基准条件就是结束展开的条件。 求列表最大值 maxNumOfList :: (Ord a)=> [a] -> a maxNumOfList [] = error "empty list" maxNumOfList [x] = x maxNumOfList (x:xs) = max x (maxNumOfList xs) 递归练习 使用递归实现几个haskell已有的函数 replicate 生成一个列表有n个元素的列表,列表个数为第一参数,列表元素为第二参数。 Prelude > replicate 3 5 [ 5,5,5 ] 实现 replicate' :: Int -> a -> [a] replicate' n x | n <= 0 = [] | otherwise = x:replicate' (n-1) x take 从列表中去一定数量的元素, 第一个参数为元素个数,第二个参数为列表 Prelude> take 3 [9,8,7,6,5,4,3] [9,8,7] 实现 take' :: (Num i, Ord i) => i -> [a] -> [a] take' n

js递归生成树型下拉菜单

老子叫甜甜 提交于 2020-01-21 17:39:18
需求:我需要把一个单表的数据转换成类似菜单那种如图所示:我呢需要把这个菜单树放入到下框里面去如图所示:下面是实现思路:1.第一步1.1var afTypeJson=${afTypeJson}// 这是从后台接口传到jsp页面的数据看一下后台传过来的源数据,里面并没children字段 //把扁平数据转成树形数据(可以实现无限层级树形数据结构,只适用于单个表的数据)1.2var json=treeDataformat(afTypeJson,'typeId','parentId','children');再来看一下数据: 好的,走到这一步的话先恭喜下自己,已经成功一半啦!(赶紧奶一口白开水) 2.第二步 如果想实现图二的效果我们需要给它伪造爸爸(父节点parentId: -1,typeId: 0,typeNameCn: "最顶层分类",typeNameEn: "Top")这里面的字段根据你自己的实际情况来改 2.1 var tree=[{parentId: -1,typeId: 0,typeNameCn: "最顶层分类",typeNameEn: "Top",children:common.deepClone(json)}];2.2 varselectTree=creatSelectTree(tree);2.3 var selectbox=document.getElementById(

穷举法和递归算法

倾然丶 夕夏残阳落幕 提交于 2020-01-21 10:03:55
枚举算法(穷举法): 特点:将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,合适就保留,不合适就丢弃。例如:找出1到100之间的素数,需要将1到100之间的所有整数进行判断。 枚举算法因为要列举问题的所有可能的答案,所有它具备以下几个特点: 1、得到的结果肯定是正确的; 2、可能做了很多的无用功,浪费了宝贵的时间,效率低下。 3、通常会涉及到求极值(如最大,最小,最重等)。 4、数据量大的话,可能会造成时间崩溃。 优缺点 优点:算法简单,在局部地方使用枚举法,效果十分的好 缺点:运算量过大,当问题的规模变大的时候,循环的阶数越大,执行速度越慢 递归算法: 特点:无限调用自身这个函数,每次调用总会改动一个关键变量,直到这个关键变量达到边界的时候,不再调用。 递归的三要素: 1、明确递归终止条件; 2、给出递归终止时的处理办法; 3、提取重复的逻辑,缩小问题规模。 来源: CSDN 作者: 王同學 链接: https://blog.csdn.net/qq_43605753/article/details/104058317

依赖注入、递归组件的用法

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

[ 具体数学 ] 递归式与封闭式

此生再无相见时 提交于 2020-01-20 01:46:25
递归问题 汉诺塔(HANOI) 命题 有三根杆子,第一根有大小从小到大共 \(n\) 个盘子,要求遵循以下3个规则,将在第一个杆子上全部的盘子移至第三个杆子。 每次只能移动一个盘子。 每次只能移动每个杆子最上面的盘子。 每根杆子上的盘子下面大,上面小。 求问题的最小步数。 例子: 当 \(n=3\) 时,移动方法如下图所示。 最小移动次数为 \(7\) ,故 \(n=3\) 时命题的解为 \(7\) 。 解决 方法:命名并求解 命名 设 \(H(n)\) 为 \(n\) 个盘子时汉诺塔问题的解. 三个杆子的编号分别为 \(A,B,C\) . 第 \(i\) 层盘子为 \(h_i\) . 求解 显然, \(H(1)=1\) 观察可得,将 \(n\) 个盘子从 \(A\) 移动到 \(B\) 相当于将 \(h_1,h_2\cdots h_{n-1}\) 移动至 \(B\) 后,将 \(h_n\) 移至 \(C\) ,再将 \(h_1,h_2\cdots h_{n-1}\) 移至 \(C\) . 由定义知,将 \(h_1,h_2\cdots h_{n-1}\) 从 \(A\) 移至 \(B\) 需 \(H(n-1)\) 步. \(\therefore H(n)=2H(n-1)+1\qquad H(1)=1\) 检验 已知 \(H(3)=7\) \[\because H(n)=2H(n-1

汉诺塔问题-递归

穿精又带淫゛_ 提交于 2020-01-19 21:52:58
最近看了一下递归的经典问题汉诺塔问题,并且自己用java实现了一下。 首先我们来看一下问题的描述:设 a b c 是三个塔座。开始时,在a塔上有一叠共n个圆盘,这些圆盘自上而下,由小到大的叠放在一起,个圆盘从小到大的编号为1,2,3…n,如图,现要求将塔座a上的所有圆盘都移动到塔座b上,并仍按同样的顺序叠置。在移动圆盘时应该遵循以下移动规则: 规则(1)每次只能移动一个圆盘。 规则(2)任何时刻都不允许将较大的圆盘压在较小的圆盘之上。 规则(3)在满足移动规则(1)和(2)的前提下,可将圆盘,移至a,b,c中任意一塔。 问题分析:首先将n个盘子分为两部分上层的n-1个盘子和最下层的一个最大的盘子,想要将n个盘子都移到b上,就需要先将上层的n-1个盘子都移动到c上,然后将最下层的一个盘子移动到b上,最后再将n-1个盘子从c移动到b,那么问题来了,如何把n-1个盘子从a移动到c再将从c移动到b呢,到这里仔细想我们就会发现,其实这两个问题就是和原问题相同的问题,只是问题的规模变小了1,所以说相同的问题就可以采用相同的方法,依然按照n规模的解法解决n-1的问题,这也就是递归的思想,自己调用自己,将一个规模较大的问题逐层分解,但是分解后的问题都是与原问题相同的问题,一直分解到问题可以直接解决,比如说本问题到什么时候是可以直接解决的?当然是当n=1的时候。下面就是汉诺塔问题的java实现, /

递归 || 递归的相关实例练习

拈花ヽ惹草 提交于 2020-01-19 07:02:44
递归的使用前提: 当调用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归 package com.itheima.demo02.Recursion; public class Demo01Recurison { public static void main(String[] args) { //a(); b(1); } /* 构造方法,禁止递归 编译报错:构造方法是创建对象使用的,一直递归会导致内存中有无数多个对象,直接编译报错 */ public Demo01Recurison() { //Demo01Recurison(); } /* 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。 11157 Exception in thread "main" java.lang.StackOverflowError */ private static void b(int i) { System.out.println(i); if(i==20000){ return; //结束方法 } b(++i); } /* 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。 Exception in thread "main" java.lang.StackOverflowError */ private static void a() {

算法设计方法概览

僤鯓⒐⒋嵵緔 提交于 2020-01-19 00:49:21
算法设计方法概览 文章目录 算法设计方法概览 递归算法 什么是递归 定义及分类 直接递归 间接递归 尾递归 使用场景 递归模型 递归算法设计 递归与数学归纳法 第一数学归纳法 第二数学归纳法 递归算法设计的一般步骤 分治算法 分治法概述 使用场景 分治法的求解过程 蛮力法 蛮力法概述 使用场景 回溯法 问题的解空间 概述 种类 什么是回溯法 使用回溯法的一般步骤 分枝限界法 什么是分枝限界法 分枝限界法的设计思想 1. 设计合适的限界函数 2. 组织活结点表 3. 确定最优解的解向量 采用分枝限界法的三个关键问题 贪心法 贪心法概述 贪心法应用约束 贪心选择性质 最优子结构性质 动态规划 动态规划的原理 动态规划求解的基本步骤 动态规划与其他方法的比较 递归算法 什么是递归 定义及分类 直接递归 在定义一个过程或者函数时,出现调用本过程或本函数的成分,称之为递归。如果调用自身,称之为直接递归; 间接递归 若过程或者函数p调用过程或者函数q,而q又调用p,称之为间接递归; 任何间接递归都可以等价地转换为直接递归; 尾递归 如果一个递归过程或递归函数中递归调用语句是最后一条执行语句,则称这种递归为尾递归; 使用场景 可以使用递归解决的问题,应该满足以下三个特点: 需要解决的问题可以转换为一个或多个子问题来求解,而这些子问题的求解方法和原问题完全相同,只是数据规模不同;

递归函数初步理解---python实现(汉诺塔问题)

不羁岁月 提交于 2020-01-18 22:36:27
递归常被用来描述以自相似的方法重复事物的过程,在程序中指的是在函数定义中使用函数自身的方法。 递归是一个树结构,分为递推和回归的过程,当递推到达底部时,就会开始回归。 问题描述:A比B大两岁,B比C大两岁,C的年龄为18,求A的年龄? 代码实现: def age(n):   if n == 1:     return 18   else:     return age(n-1) + 2#这个相当于一个断点或者称为调用点 print(age(3)) 可以用python中的pdb来看程序的具体执行步骤,在代码中加入以下代码即可 import pdb pdb.set_trace() 递归的运用较为著名的就是汉诺塔问题 来源: https://www.cnblogs.com/zoutingrong/p/12210434.html