递归调用

剑指Offer刷题总结

你。 提交于 2020-02-28 21:50:31
1. 二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路题 从右上角或者左下角开始缩小范围。 2. 替换空格 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 语法题 3. 从尾到头打印链表 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 头插法 数组反转 栈 递归 4. 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 递归 API:Arrays.copyOfRange() 5. 用两个栈实现队列 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 简单题 6. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5

js实现树级递归,通过js生成tree树形菜单(递归算法)

妖精的绣舞 提交于 2020-02-28 16:09:51
需求:首先这是一个数据集—js的类型,我们需要把生成一个tree形式的对象 : var data = [ { id: 1, name: "办公管理", pid: 0 }, { id: 2, name: "请假申请", pid: 1 }, { id: 3, name: "出差申请", pid: 1 }, { id: 4, name: "请假记录", pid: 2 }, { id: 5, name: "系统设置", pid: 0 }, { id: 6, name: "权限管理", pid: 5 }, { id: 7, name: "用户角色", pid: 6 }, { id: 8, name: "菜单设置", pid: 6 }, ]; id,与pid之间的对应关系,当pid不存在,或pid:0的时候,这一项,应该为树的顶端,那么我们需要去重新建一次索引,怎么建呢,,,以原数据集的id的值,重新生成一个数据如下: var data = [ {id: 1, name: "办公管理", pid: 0 , children:[ { id: 2, name: "请假申请", pid: 1, hildren:[ { id: 4, name: "请假记录", pid: 2 }, ], }, { id: 3, name: "出差申请", pid: 1}, ] }, {id: 5, name:

fib函数用迭代替换递归

五迷三道 提交于 2020-02-28 11:36:31
fib函数递归实现: long Fib(long n) { if (n <= 1) { return n; } else { var t1 = Fib(n - 1); var t2 = Fib(n - 2); return t1+ t2; } } fib函数改为迭代: class Class1 { class Node { public Node(long n, int pos) { this.n = n; this.retStatus = pos; } public long n; //参数 public int retStatus; //0,表示temp中没有保存值 //1, 表示temp中保存了栈顶记录的t1值。 //2,表示temp中保存了栈顶记录的t2值。 public long ret; //返回值 public long t1; //存第一次调用Fib的返回值 public long t2; //存第二次调用Fib的返回值 } long Fib(int n) { long temp = 0; var s = new Stack<Node>(); s.Push(new Node(n, 0)); while (s.Count > 0) { Node top = s.Peek(); switch (top.retStatus) { case 0: if (n <= 1) {

python练习之递归

主宰稳场 提交于 2020-02-28 09:37:16
使用递归编写一个 power() 函数模拟内建函数 pow(),即 power(x, y) 为计算并返回 x 的 y 次幂的值: def power ( x , y ) : if y : return x * power ( x , y - 1 ) else : return 1 print ( power ( 2 , 3 ) ) 使用递归编写一个函数,利用欧几里得算法求最大公约数,例如 gcd(x, y) 返回值为参数 x 和参数 y 的最大公约数: def gcd ( x , y ) : if y : return gcd ( y , x % y ) else : return x print ( gcd ( 4 , 6 ) ) 使用递归编写一个十进制转换为二进制的函数(要求采用“取2取余”的方式,结果与调用bin()一样返回字符串形式): def Dec2Bin ( dec ) : result = '' if dec : result = Dec2Bin ( dec // 2 ) return result + str ( dec % 2 ) else : return result print ( Dec2Bin ( 62 ) ) 写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345) ==> [1,

算法之递归

孤街浪徒 提交于 2020-02-28 07:41:38
文章来源: http://blog.seclibs.com/算法之递归/ 递归是一种应用非常广泛的算法,在很多的数据结构和算法的编码中都会用到,理解递归是非常重要的。 递归在平时的生活中也是非常常用的,当你排队的时候需要知道自己排在第几个位置,而前面的人又比较多,你不能自己数出来,就可以询问你前一个人他的位置,在他的位置基础上加一便是你的位置,那如果他也不知道他的位置呢,就可以用同样的方法,继续向前询问,直到第一个人,第一个人就不用往前问了,他直到自己是第一个,这个过程就是一个递归的过程。 去问的时候叫做“递”,返回来的时候叫做“归”,假设自己是第n排,求自己位置的函数为f(n),f(n-1)就是前一个人的位置,我们的位置就是f(n-1)+1,同样前一个人的位置也可以用这个公式来计算, 直到第一个人f(1)=1,这一整套流程便是递归的实际利用,编写成代码如下 在编写递归代码的时候,有两点必要的条件: 一个问题可以分解为多个结构相同,规模不同的子问题。 存在终止条件。 如果结构不同,那就不能构造递归了;如果不存在终止条件的话,将会无限循环,看上面的那个例子,它的终止条件就是执行到第一个人的时候,开始往后返回。 递归就这样完成了,上面这个例子是只有一个递归调用的分支,还是比较好理解的,如果有多个递归分支的话,单纯靠人脑是很难理解清楚的,计算机比较适合做重复的工作

Java中递归和迭代

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-27 15:42:32
关于递归调用,我还是在网上找的相关知识点。所谓递归,就是程序调用自身的编程技巧,一个过程或函数在其定义或说明中有直接或间接调。 通过例子来实现: public class factorial { public static void main(String[] args) { System.out.println(f(6)); } public static long f(int n) { if(n==1) { return 1; }else { return n*f(n-1); } } } 迭代:简而言之,就是A不停的调用B。通过另一个例子实现: public class iteration { public static void main(String[] args) { System.out.println(f(20)); } public static long f(int index) { if(index==1||index==2) { return 1l; } long f1=1l; long f2=1l; long f=0; for(int i=0;i<index;i++) { f=f1+f2; f1=f2; f2=f; } return f; } } 来源: oschina 链接: https://my.oschina.net/u/4455988/blog

Uncaught RangeError: Maximum call stack size exceeded.

帅比萌擦擦* 提交于 2020-02-26 11:00:18
堆栈溢出的产生是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址,一般容易在递归中产生。所以这种错误一般是在递归函数当中出现,结合报错提示中提到的 returnNodeParameter方法,查看 returnNodeParameter方法自身以及 returnNodeParameter内其他调用方法中是否存在递归函数调用。自己写的代码,那些是递归函数那些不是,心里都有数,既然明确了是递归函数的锅,那就从调用的递归函数中找原因就是。 产生错误原因:问题原因很简单,在 if (temp[i].pid !== ‘0’) 中将本该写成 this.selectedNodePid 的误写成了 this.selectedNode,导致 this.selectedNodePid 在后续递归执行中一直得不到更新,永远是最开始调用的值,从而递归循环一直转不出来,导致无限循环,造成堆栈溢出。 归根结底是参数和参数条件判断的错误导致递归函数一直循环递归调用,无法停止,从而只有在超出浏览器最大堆栈量(内存溢出)时,浏览器抛出错误才能停止。 可以理解为,项目里有死循环! 来源: CSDN 作者: css3html5csdn 链接: https://blog.csdn.net/qq_38402659/article/details/104511088

课堂作业02程序设计作业

瘦欲@ 提交于 2020-02-26 08:37:51
课后作业1: 1.设计思想: (1)适用组合数公式:先用递归方法,求出阶乘,然后求出组合数的大小。 (2)使用递推的方法:递推是由前往后退,通过杨辉三角找出规律,利用二元数组求出组合数的大小。 (3)使用递归的方法:由前往后调用递归公式,利用组合数公式,初始化值,求出组合数的大小。 2.程序流程图: 3.源程序代码: (1)使用组合数公式的代码: package zuheshu; import java.util.Scanner; import java.lang.Math.*; import java.math.BigInteger; public class Zuheshu { //组合数公式 public static BigInteger jiecheng(int n) { if(n<0) { System.out.println("输入有误"); } if(n==1||n==0) { return BigInteger.valueOf(1); } else { return BigInteger.valueOf(n).multiply(jiecheng((n-1))); } } public static long calculateN(int n){ if(n==1||n==0){ return 1; } return n*calculateN(n-1); }

递归函数-汉诺塔经典递归

非 Y 不嫁゛ 提交于 2020-02-25 01:15:06
前言 最近在读《JavaScript语言精粹》,对递归函数有了进一步的认识,希望总结下来: 递归是一种强大的编程技术,他把一个问题分解为一组相似的子问题,每一问题都用一个寻常解去解决。递归函数就是会直接或者间接调用自身的一种函数,一般来说,一个递归函数调用自身去解决它的子问题。 "汉诺塔"经典递归问题 "汉诺塔"是印度的一个古老传说,也是程序设计中的经典的递归问题,是一个著名的益智游戏:   题目如下:     塔上有三根柱子和一套直径各不相同的空心圆盘,开始时源柱子上的所有圆盘都按从大到小的顺序排列。目标是通过每一次移动一个圆盘到另一根柱子上,最终把一堆圆盘移动到目标柱子上,过程中不允许把较大的圆盘放置在较小的圆盘上;      寻找规律(把所有的圆盘移动到C):   1)n(圆盘个数) == 1     第一次:1号盘 A -> C sum(移动次数) = 1   2)n == 2     第一次:1号盘 A -> B     第二次:2号盘 A -> C     第三次:1号盘 B -> C  sum = 3   3)n == 3     第一次:1号盘 A -> C     第二次:2号盘 A -> B     第三次:1号盘 C -> B     第四次:3号盘 A -> C     第五次:1号盘 B -> A     第六次:2号盘 B -> C     第七次

深入理解和设计递归技术的关键点的思考

馋奶兔 提交于 2020-02-25 01:11:42
如何理解递归,写出正确的递归程序,我觉得有几个关键点: 1.要从整体把握问题 递归的难点在于人脑并不适合去跟踪递归中自己调用自己的这个过程,这是因为人脑中不像计算机一样有一个可以记忆的堆栈, 但是不同的是人是会归纳的,而计算机只知道调用-返回。 因此,理解和设计递归,一定要从整体把握,数学归纳法和递归是一个对称的关系,数学归纳法不断的扩展自己,递归则是不断的分解 自己。递归中的递就是把主问题分解成子问题,归就是利用子问题的解逐步向上求解的过程了。 关键点是要善用数学归纳法里面的假设 ,就是假设子问题已经求解了,它得到的结果是什么,一旦这么想就是在从整体上把握问题,不必再去纠结细节。设计一个递归函数的时候,首先像普通函数一样设计一个算法框架,控制好程序逻辑,处理递归调用的时候假设是在调用一个其他的函数,这个函数已经设计好,你只需要知道他做什么事,然后返回什么就可以了,具体怎么做的,不需要去想,这似乎有些矛盾,因为这个函数本来就是自己,怎么不需要去想怎么做的呢?其实这就是递归难以理解的原因。所以必须先把细节放在一边,先确定好框架,然后再去处理细节。 2.关注函数的返回值是什么,如何利用子函数调用的返回值得到调用的返回值。 第一条里面设计好框架以后,然后我们就需要关注函数处理的细节了,这个细节包括流程分支,函数的返回值。 函数的返回值直接关系到函数是否正确执行