递归调用

LeetCode 206:反转链表 Reverse Linked List

隐身守侯 提交于 2020-01-02 01:09:00
反转一个单链表。 Reverse a singly linked list. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题? Follow up: A linked list can be reversed either iteratively or recursively. Could you implement both? 解题思路: 每次遍历到最后一位取节点这种方法就算了时间复杂度太高。如题目进阶要求的两种方法,迭代和递归: 迭代: 每次分出来一个节点把节点 作为头节点 添加到新链表上: 原链表:1->2->3->4->5 分离第一个节点作为头节点添加到新链表:1 原链表:2->3->4->5 分离下一个节点作为头节点添加到新链表:2->1 原链表:3->4->5 分离下一个节点作为头节点添加到新链表:3->2->1 原链表:4->5 分离下一个节点作为头节点添加到新链表:4->3->2->1 原链表:5 分离下一个节点作为头节点添加到新链表:5->4->3->2->1 原链表:null Java: class Solution { public ListNode reverseList(ListNode head) { if (head == null

java递归和反向递归

淺唱寂寞╮ 提交于 2020-01-01 15:56:05
1. 递归查询树tree结构有两种做法 : 第一种,递归查询数据库结构, 第二种,一次性将数据库表中的所有数据查出来,然后再递归查出来的list集合, 第一种做法适合数据量较少的tree结构,因为要一直查询数据库数据量大时速度回相对较慢,所以数据量大时建议使用第二种方法,如 图1 所示是一个常见的树tree结构 图1 2. 反向递归(逆向递归)查询树tree结构根据关键字过滤数据 大家有么有遇到过这个问题:我想要根据关键字过滤查询出相关数据和它的上级结构,得到 图1所示 结果,可往往不知道怎么做,查不出上级结构总是得到 图3 类似的结构,要解决这个比较常见的问题就要用到反向递归的算法,网上我那个网搜不到类似的解决方案,本人一时兴趣来了,做了一套递归和反递归的解决方案,简单易懂,大家可以相互交流一下 图2 图3 3.示例代码 [java] view plain copy /** * 说明方法描述:将list转为树tree结构 * * @param allRrecords * @return * @time 2016年5月10日 下午6:00:35 * @author yangdong */ public List<Record> useListRecordToTree(List<Record> allRrecords) { List<Record> listParentRecord

java ssm使用递归写树形结构

我怕爱的太早我们不能终老 提交于 2020-01-01 15:55:31
实体类: private String dspId; private String parentId; //父类id private String dataName; private Integer sortingNumber; private String remarks; private Date createTime; private Date updateTime; private Date deleteTime; private Integer dataFlag; private Integer anId; private Integer isParent;//是否有父类 private List<DataSpecies> chlidSpecies; dao层和接口使用mybatis逆向生成,这里就不住解释. service层: public List<DataSpecies> findDataspecies() { // TODO Auto-generated method stub //查询所有的结果 DataSpeciesExample example = new DataSpeciesExample(); Criteria criteria = example.createCriteria(); criteria.andDataFlagEqualTo(0);

菜单递归

浪子不回头ぞ 提交于 2020-01-01 15:55:00
/** * @ClassName: FunctionService * @Description: 功能菜单 * @author: yaozhenhua * @date: 2018/12/26 12:29 */@Servicepublic class MenuService { @Resource MenuDao menuDao; /** *查询可用且上线的菜单 * * @param * @author: yaozhenhua 2019/3/27 17:24 */ public List<MenuVO> listMenu() throws InstantiationException, IllegalAccessException, AobpException { //结果处理容器 List<MenuVO> menuVOS = new ArrayList<>(); //查询一级菜单 List<MenuBO> menuBOS = menuDao.listParentMenu(); if(!EmptyUtils.isEmpty(menuBOS)){ //一级菜单排序 Collections.sort(menuBOS, new Comparator<MenuBO>() { @Override public int compare(MenuBO o1, MenuBO o2) { int

深究递归和迭代的区别、优缺点及实例对比

戏子无情 提交于 2019-12-31 15:50:34
1.迭代是人,递归是神! 从“编程之美”的角度看,可以借用一句非常经典的话: “迭代是人,递归是神!” 来从宏观上对二者进行把握。 从概念上讲,递归就是指程序调用自身的编程思想,即一个函数调用本身;迭代是利用已知的变量值,根据递推公式不断演进得到变量新值得编程思想。 2.递归 递归就是函数自己调用自己。 2.1构成递归需具备的条件: 子问题须与原始问题为同样的事,且更为简单; 2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。 2.2递归的基本原理 第一: 每一级的函数调用都有自己的变量。 第二: 每一次函数调用都会有一次返回。 第三: 递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序。 第四: 递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反。 第五: 虽然每一级递归都有自己的变量,但是函数代码并不会得到复制。 2.3递归优缺点 2.4编写一个递归函数 这个递归函数的功能是什么,怎样调用这个函数,即设计好递归函数的返回值和参数列表 什么时候应该结束这个递归,它的边界条件(出口)是什么(边界条件) 在非边界情况时,怎样从第n层转变成第n+1层(递推公式) 例: int f(int n) {   //出口 if (n > 0) { return n + f(n - 1); } else { return 0; } } 解析: 具体步骤

反驳 老赵 之 “伪”递归

若如初见. 提交于 2019-12-30 06:01:21
今天看了老赵的随笔《 使用Lambda表达式编写递归函数 》,老赵给其中两行代码下了“伪递归”的定论,我非常不满,今写文反驳之。 先说下老赵这篇文章的由来,我之前也写过一篇和递归有关的随笔《 由Fibonacci数列引出“委托扩展”及“递推递归委托” 》,里面给出了这样的一个递归定义(以下称为代码一): public static Func < int , int > Fibonacci = n => n > 1 ? Fibonacci(n - 1 ) + Fibonacci(n - 2 ) : n; 是计算Fibonacci数列的,注意上这句代码中用了“static”,可以编译通过,绝对没有问题!老赵回复中说不用static无法编译通过,于是我又给出了以下代码(以下称为代码二): Func < int , int > Fibonacci = null ; Fibonacci = n => n > 1 ? Fibonacci(n - 1 ) + Fibonacci(n - 2 ) : n; 代码二就是老赵随笔中开始处的那两行被称为“伪”递归代码,所说的朋友自然就是我了! 首先老赵随笔只引用了代码二(是在回复中给出的),而代码一(正文中的)却根本没有提及,不免有断章取义的嫌疑。接着老赵又给我的代码戴上了“伪”递归的帽子... 于是我奋起反驳,以螳臂当车之力...

java递归

↘锁芯ラ 提交于 2019-12-29 21:01:30
A.递归思想: 1.递归的基本思想就是“自己调用自己”,或直接或间接,我们也可以简单地理解成这是一个不知道循环次数的循环。 B.递归结构: 1.递归出口:一般递归尽头和if语句配合使用,判断什么时候不调用自身了,如果没有递归尽头,会陷入一个死循环中 2.递归体:就是调用自身的语句 //递归思想求阶乘问题 package jh_08_diGui; public class jh_10_diGui { public static void main(String[] args) { int fac = fac(5); //主方法调用,计算一下5的阶乘 System.out.println(fac); } public static int fac(int i) { if (i == 0) { return 1; //数学规定0的阶乘等于1 }else { return i * fac(i - 1); // 自己调用自己的方法,直到i==0时结束 } } } //递归思想求 1——100的和 package com.jh.diGui; public class diGui{   public int sum(int i ){     if(i == 1){       return 1;     }else     {       return i + sum(i - 1);     }

数据结构与算法之递归

一世执手 提交于 2019-12-28 19:43:39
递归: 定义:一个函数自己直接或间接调用自己 (不要写成死递归) 举例: 1. 1+2+3+4+...+100的和 求阶乘 汉诺塔 走迷宫 函数的调用(以 C语言为例) 当一个函数的运行期间调用另一个函数时,在运行被调用函数之前,系统需要完成三件事: 将所有的实际参数,返回地址(即调用函数的位置,等到调用函数执行完毕后返回这个位置,继续执行下面的代码)等信息传递给被调函数保存 为被调函数的局部变量(也包括形参)分配存储空间 将控制转移到被调函数的入口 从被调函数返回主调函数之前,系统也要完成三件事: 保存被调函数的返回结果 释放被调函数所占的空间(指静态空间,不包括 malloc动态分配的空间) 依照被调函数保存的返回地址将控制转移到调用函数 当有多个函数相互调用时,按照 “后调用先返回”的原则,上述函数之间信息传递和控制转移必须借助“栈”来实现,即系统将整个程序运行时所需的数据空间安排在一个栈中,每当调用一个函数时,就在栈顶分配一个存储区,进行压栈操作,每当一个函数退出时,就释放它的存储区,就进行出栈操作,当前运行的函数永远都在栈顶位置。 递归必须满足的条件 递归必须得有一个明确的终止条件 该函数所处理的数据规模必须在递减 这个转化必须是可解的 循环和递归 递归 易于理解 速度慢 存储空间大 循环 不以理解 速度快 存储空间小 汉诺塔伪算法 if(n > 1) { 先把

python的递归

大兔子大兔子 提交于 2019-12-28 14:28:12
递归算法是一种直接或者间接的调用自身算法的过程。 特点: 1.递归就是在过程或者函数里调用自身。 2.在使用递归策略时,必须有一个明确的递归条件,称为递归出口。 3.递归算法解题通常显得很简洁,但递归算法解题的效率较低。所以一般不倡导使用递归算法设计程序。 4.在递归调用的过程当中系统的每一层的返回点、局部变量等开辟了栈来存储。递归函数次数过多容易造成栈溢出等。 要求: 递归算法所体现的"重复"一般有三个条件: 1.每次在调用规模上都有所缩小(通常是减半)。 2.相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。 3.在问题的规模极小时必须用直接接触解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件的递归调用将会成为死循环而不能正常结束。 简而言之,能用循环写的就别用递归 用循环写费脑子 用递归写费内存 还是费脑子好点 斐波那契数列 循环解法 1 def Fib(n): 2 fib = [1,1] 3 if n == 1: 4 return [1] 5 elif n == 2: 6 return [1, 1] 7 elif n > 2 : 8 for i in range(2,n): 9 fib.append(fib[i-2]+fib[i-1]) 10 else: 11 return [] 12

Java 递归

守給你的承諾、 提交于 2019-12-28 14:27:53
递归 1,方法定义中自身调用自身的现象。 2,注意事项: 1,递归方法没有出口,会成为无限循环,直到溢出。//StackOverflowError 2,递归次数过多,会导致栈内存溢出。 3,构造方法不能定义递归。 3,案例: 1,求20的阶乘 /** * 求阶乘 :20! * 出口:当阶乘成为1的时候结束 * 规律:n(n-1)! * */ public class Recursion{ public static void main(String[] args){ System.out.println(rec(20)); } public static int rec(int n ){ if(n==1){ return 1; }else{ return n*rec(n-1); } } } 2,古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问20个月的兔子对数为多少? /** * 分析: * 1,1,2,3,5,8,13..... * 出口:第1,2,3月已知 * 规律:从第三项开始,第一项是前两项之和 */ public class Rabbit{ public static void main(String[] args){ System.out.println(getRabbit(20)); }