递归调用

博客作业04--树

僤鯓⒐⒋嵵緔 提交于 2020-01-15 14:58:26
1.学习总结 1.1树结构思维导图 1.2 树结构学习体会 学习树最痛苦的事情就是递归,最开始的先序,中序,后序的递归算法,看了好久才能大致的明白程序的思路,还有就是表达式树的建立,跟栈的中缀转后缀表达式有点类似,但是一用到递归就没那么好理解了,其实重点还是要多花时间去研究书上的代码,学习树的知识,如果对书本的内容不是很熟悉,很难对树有很好的理解,做起题目来也是非常累人的,因为根本不明白程序下一步要怎么走。 2.PTA实验作业 2.11题目: jmu-ds-表达式树 2.12设计思路(伪代码或流程图) void InitExpTree(BTree &T,string str) 建op栈,op.push('#') 初始化根节点栈:stacktree栈 while(表达式未结束) { if(str[i]==数字字符) 生成一个只有根节点的子树T。stacktree.push(T) if(str[i]==运算符) { while(str[i]<op栈顶运算符)栈顶优先级别高 { 创建一个树结点T,数据为op.top() stacktree弹出2个根节点T1,T2 T->lchild=T1;T->rchild=T2; stacktree.push(T); } if(str[i]>op栈顶元素运算符) op.push(str[i]) if(str[i]==op栈顶运算符) op.pop().

八大算法思想

拈花ヽ惹草 提交于 2020-01-15 09:28:39
八大算法思想分别是:枚举、递推、递归、分治、贪心、试探法、动态迭代和模拟算法思想。 1、比较“笨”的枚举算法思想 枚举最大的缺点是运算量比较大,解题效率不高。 如果题目的规模不是很大,在规定的时间与空间限制内能够求出解,那么最好是采用枚举法,而无须太在意是够还有更快的算法,这样可以使你有更多的时间去解答其他难题。 //枚举法解决“填写运算符”的问题 import java.util.Scanner; public class meijujisuan5ge5 { public static void main(String[] args) { // TODO Auto-generated method stub int j; int[] i=new int[5]; //用数组i来表示4个运算符 (5个数之间有四个符号,分别遍历出所有的情况) int sign;//累加运算时的符号 int count=0;//计数器,统计符合条件的方案 int num[]=new int[6];//保存操作数(输入值) float left,right; char[] oper={' ','+','-','*','/'}; System.out.println("请输入5个数,之间用空格隔开:"); Scanner in=new Scanner(System.in); for(j=1;j<=5;j++

帮助大家理解一下递归函数的返回值...

瘦欲@ 提交于 2020-01-15 09:28:07
如题: 递归函数往往可以简化我们的代码,尤其是对树的遍历和利用回溯算法写代码的时候,但是递归函数的返回值往往是困扰我们的。 总体来说,我们先要理解函数的调用过程,函数调用过程会用栈来保存函数的返回值和过程, 而递归函数就是调用自身函数的过程,所以也是用栈存储 ,这样就比较容易理解了。 下面一段代码可以帮助大家理解递归函数的返回值。 1 package test; 2 3 4 public class RecursionValueReturn { 5 6 /* 7 *目的: 8 * 递归返回值测试 9 */ 10 11 int recurse(int i) 12 { 13 if(i == 0) 14 { 15 return 0; 16 } 17 else 18 { 19 i--;//i--必须放在前面,由于函数的中间结果值用栈保存,不然i--无法执行,会使递归函数对系统的栈用光 20 recurse(i); 21 //i--; 22 } 23 24 System.out.print(" "+ i); 25 return i; 26 27 } 28 29 public static void main(String[] args) { 30 // TODO Auto-generated method stub 31 RecursionValueReturn result = new

函数递归出口的重要性!

断了今生、忘了曾经 提交于 2020-01-15 08:40:40
文章目录 函数的递归 递归函数的特点 递归代码的执行流程图 函数的递归 一个函数内部调用自己 函数内部可以调用其他函数,当然在函数内部也可以调用自己 代码特点: 函数内部的代码是相同的,只是针对参数不同,处理的结果不同 当参数满足一个条件时,函数不在执行 这个非常重要 :通常被称为递归的出口,否则会出现死循环! 递归函数的特点 def sun_number ( num ) : print ( num ) #递归的出口,当参数满足某个条件时,不再执行函数 if num == 1 : return # 自己调用自己 sun_number ( num - 1 ) a = sun_number ( 3 ) 递归代码的执行流程图 自己写的执行步骤: 在调用函数sun_number时: 第一步 :执行的是把实参3传递给函数内部的形参num, 第二步 :打印num参数 第三步 :判断如果 num == 1则返回1:否则执行下面的代码, 在这里函数又调用了一次函数Sun_number(num-1) 第四步 :这时再一次调用函数sun_number时,参数num已经为2了 第二次调用sun_number 第五步 :调用函数sun_number,再把2传递给函数内部的num 第六步 :判断如果 num 1 则返回1:否则执行下面的代码 在这里执行又调用了一次函数sun_number(num - 1)

递归和迭代的不同

倾然丶 夕夏残阳落幕 提交于 2020-01-15 08:12:31
递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合. 使用递归要注意的有两点: 1)递归就是在过程或函数里面调用自身; 2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口. 递归分为两个阶段: 1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解; 2)回归:当获得最简单的情况后,逐步返回,依次得到复杂的解. 利用递归可以解决很多问题:如背包问题,汉诺塔问题,...等. 斐波那契数列为:0,1,1,2,3,5... fib(0)=0; fib(1)=1; fib(n)=fib(n-1)+fib(n-2); [cpp] view plain copy int fib( int n) { if (0 == n) return 0; if (1 == n) return 1; if (n > 1) return fib(n-1)+fib(n-2); } 上面就是一个简单的递归调用了.由于递归引起一系列的函数调用,并且有可能会有一系列的重复计算,递归算法的执行效率相对较低. 迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B

递归和迭代的差别

断了今生、忘了曾经 提交于 2020-01-15 08:12:05
递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题类似的规模较小的问题来解决,能够极大的降低代码量.递归的能力在于用有限的语句来定义对象的无限集合. 使用递归要注意的有两点: 1)递归就是在过程或函数里面调用自身; 2)在使用递归时,必须有一个明白的递归结束条件,称为递归出口. 递归分为两个阶段: 1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解; 2)回归:当获得最简单的情况后,逐步返回,依次得到复杂的解. 利用递归能够解决非常多问题:如背包问题,汉诺塔问题,...等. 斐波那契数列为:0,1,1,2,3,5... fib(0)=0; fib(1)=1; fib(n)=fib(n-1)+fib(n-2); int fib(int n) { if(0 == n) return 0; if(1 == n) return 1; if(n > 1) return fib(n-1)+fib(n-2); } 上面就是一个简单的递归调用了.因为递归引起一系列的函数调用,而且有可能会有一系列的反复计算,递归算法的运行效率相对较低. 迭代:利用变量的原值推算出变量的一个新值.假设递归是自己调用自己的话,迭代就是A不停的调用B. 递归中一定有迭代,可是迭代中不一定有递归

递归和迭代的差别

一世执手 提交于 2020-01-15 08:11:31
递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题类似的规模较小的问题来解决,能够极大的降低代码量.递归的能力在于用有限的语句来定义对象的无限集合. 使用递归要注意的有两点: 1)递归就是在过程或函数里面调用自身; 2)在使用递归时,必须有一个明白的递归结束条件,称为递归出口. 递归分为两个阶段: 1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解; 2)回归:当获得最简单的情况后,逐步返回,依次得到复杂的解. 利用递归能够解决非常多问题:如背包问题,汉诺塔问题,...等. 斐波那契数列为:0,1,1,2,3,5... fib(0)=0; fib(1)=1; fib(n)=fib(n-1)+fib(n-2); int fib(int n) { if(0 == n) return 0; if(1 == n) return 1; if(n > 1) return fib(n-1)+fib(n-2); } 上面就是一个简单的递归调用了.因为递归引起一系列的函数调用,而且有可能会有一系列的反复计算,递归算法的运行效率相对较低. 迭代:利用变量的原值推算出变量的一个新值.假设递归是自己调用自己的话,迭代就是A不停的调用B. 递归中一定有迭代,可是迭代中不一定有递归

通过递归复制树型结构数据

落花浮王杯 提交于 2020-01-14 16:08:10
系统需要实现树型结构复制功能,数据设计为id,pid,name结构类型,现将使用递归实现的方法记录,步骤如下: 一、先获取根节点 二、循环根节点 三、循环根节点调用递归插入数据方法 递归方法代码如下,具体需求自行修改 public static void isSetInfoByCopy(String Id, String parentId) throws SQLException { //新id String newId = UUIDTools.getUUID().toUpperCase(); **DAO dao = new **DAO(); //先插入表数据(插入代码自行写) dao.isSetInsertInfoByCopy(newId, Id, parentId); //查询是否有子节点(查询方法自行写) List<Map<String, Object>> list = dao.queryChildrenInfoByYear(Id); //循环子节点、递归 String childId; if (!list.isEmpty()) { int len = list.size(); for (int i = 0; i < len; i++) { childId = (String) list.get(i).get("key"); isSetInfoByCopy(childId,

等差数列,for循环,递归和尾递归的对比

╄→尐↘猪︶ㄣ 提交于 2020-01-14 16:03:35
生活中,如果1+2+3+4.....+100,大家基本上都会用等差数列计算,如果有人从1开始加,不是傻就是白X,那么程序中呢,是不是也是这样。今天无意中看到了尾递归,以前也写过,但是不知道这个专业名词,今天写一下对比下性能问题。 今天主要是看到了尾递归,所以联想到了这些,写下这篇文章,其中也把Benchmark (Nuget上的BenchmarkDotNet)的基准测试用了下,感觉比较好用,赞。Benchmark 需要在release下运行。 原则上所有的递归操作,都可以写成循环操作。尾递归是指,在函数返回的时候,调用自身本身,并且return语句不能包含表达式。这样编译器或者解释器就可以把尾递归做优化,试运行速度更快。 测试类 public class TestClass { /// <summary> /// for循环 /// </summary> /// <param name="n"></param> /// <param name="counter"></param> /// <returns></returns> public int TestFor(int n) { int s = 1; for (int i = 2; i < n + 1; i++) { s = s + i; } return s; } /// <summary> /// 等差数列 /// <

JS高级---递归

余生颓废 提交于 2020-01-13 10:40:32
递归 递归: 函数中调用函数自己, 此时就是递归, 递归一定要有结束的条件 var i = 0; function f1() { i++; if (i < 5) { f1(); } console.log("从前有个山,山里有个庙,庙里有个和尚给小和尚讲故事"); } f1(); 来源: https://www.cnblogs.com/jane-panyiyun/p/12185817.html