首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java结合方法帧理解递归编程思想

Java结合方法帧理解递归编程思想 递归的介绍 In computer programming, the term recursive describes a function or method...递归和方法 回顾一下:JMM内存模型。...; 所以每次调用时都会 ①保存当前这次帧的局部变量 ②操作,去继续调用比它小1的帧 ③继续执行①-③,知道找到最后一个——递归终止条件return 1 ④方法逐步返回,回到上一层的帧…直到最开始的帧...这个过程需要大量帧,我们知道帧是需要一定的内存的,所以空间损耗很大; 尾递归优化 尾递归——当递归调用时最后的语句是函数自身,并且没有任何其他的表达式; 对于尾递归,现代编译器会对其做优化,复用帧...改写,使用尾递归,复用帧: private int factorial2(int i, int result){ if( i <= 1 ){ return result;

33310
您找到你想要的搜索结果了吗?
是的
没有找到

递归和队列、堆栈

一、递归 概念 一个函数调用自身称为递归调用 一个会调用自身的函数称为递归函数 说明 凡是循环能干的事,递归都能干 以后尽量少使用递归递归不好写,效率低 写递归的过程 a、写出临界条件 b、找这一次和上一次的关系...sum = 0 for i in range(1, n + 1): sum += i return sum # 递归实现...1、结构 和队列:两种数据存储格式 先进后出 代码 myStack = [] # 压(往结构中存储数据) myStack.append(1) print(myStack) myStack.append...这句话的意思是顶的地址和的最大容量是系统预先规定好的,在WINDOWS下,的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过的剩余空间时,将提示overflow。...注意静态变量是不入的。

32020

论 : 递归式访问,如何用实现所有递归操作(函数调用底层篇)

重大错误说明 : 顶的指针始终是指向最后一个入元素的位置的,不是最后一个入元素的位置上面!请读者留意 (PS : 后来又看了一下,好像也不是什么大问题...)...上一篇 : 论 : 递归式访问,如何用实现所有递归操作(基础知识篇) 2.函数调用底层篇(了解递归调用的硬件实现) 一开始,main函数没有调用add之前他的帧如下图,当然,下面只是简略介绍...子函数返回过程: 子函数完成之后,子函数的帧会被废弃掉 ? 上面大圈里的小圈,两句汇编就是把顶和底移动回原来的main帧处。 ?...1.子函数直接调用父函数帧内的形成,访问父函数 2.父函数直接访子函数在EAX中遗留的返回值 3.父函数调用子函数,子函数创建帧,子函数完成后子函数的帧销毁 下一篇 : 论 : 递归式访问...,如何用实现所有递归操作(幼儿园题目篇) 护眼绿: 没人看的结语: 首先很感谢你看到这里,辛苦了。

84130

论 : 递归式访问,如何用实现所有递归操作(基础知识篇)

1.基础知识(了解结构) 先回顾一下关于的最简单知识; 本文主要涉及线性 假如我们不考虑底,底是固定不动的,只考虑顶,那么就像一只放在桌子上的空杯,杯底固定贴在桌子上。...以下的内容都会以此数据结构作为基础,讲解递归的联系 可能你写过某道题目,说要用来实现某某功能,不能用递归。但实际上,递归用到的数据结构本质上就是。...所以说,递归只是在你看不到的地方用了,完成了你的操作。 为什么那么说呢? 我们来浅浅地了解一下在内存中函数调用的过程。 众所周知,内存是的抽象模型是一串线性的单元格。...在函数调用过程中,每个函数的开始,都会在内存中一段被称为区的空间内创建帧(稍后解释) 这片区 就好像我们上面说的水杯,而帧就是上面所说的方糖 内存被编址成一个个存储单元,上面所说的两个刻度条间的空间就可以当成一个存储单元...下一篇 : 论 : 递归式访问,如何用实现所有递归操作(函数调用底层篇) 护眼绿: 没人看的结语: 首先很感谢你看到这里,辛苦了。

31510

论 : 递归式访问,如何用实现所有递归操作(幼儿园题目篇)

上一篇 : 论 : 递归式访问,如何用实现所有递归操作(函数调用底层篇) 2.用基础知识实现递归式访问 基于以上几点,我们怎么把所有的递归都用这个数据结构实现呢?...假设a b 只出现一次) BiTNode* findNearestAncestor(BiTree tree, char a, char b); 题目1为例,思路开导与解析 : 首先我们需要写出大概的使用递归实现功能的代码...还有更重要的一点,递归函数的方法体只有一个,也就是说,对说有的帧都要进行同一个操作,无论这个帧包含的信息有多么不一样! 所以,方法中对帧的处理至关重要,他将作用于所有帧。...4,5两处子函数帧入,表示父函数递归调用子函数。...: 递归式访问,如何用实现所有递归操作(幼儿园题目篇,题目2) 护眼绿: 没人看的结语: 首先很感谢你看到这里,辛苦了。

41320

Java结构_java

大家好,又见面了,我是你们的朋友全君。 Java结构 概念 典型的结构如下图所示:结构只能在一端操作,该操作端叫做顶,另一端叫做底。...向一个插入新元素又称作进、入或压,它是把新元素放到顶元素的上面,使之成为新的顶元素; 从一个删除元素又称作出或退,它是把顶元素删除掉,使其相邻的元素成为新的顶元素。...那样在执行的过程中, 会先将A压入, A没有执行完, 所有不会弹出. 在A执行的过程中调用了B, 会将B压入到, 这个时候B在顶, A在底....所以当前的顺序是: 顶A->B->C->D顶 D执行完, 弹出. C/B/A依次弹出. 所以我们有函数调用的称呼, 就来自于它们内部的实现机制....(通过来实现的) 清楚了上面这个调用流程就应该知道的重要性了吧。在Java中已经跟我们封装好了 Stock类就是结构 的应用 首先了解一下中的常用方法?

54510

汉罗塔c++递归_递归的区别

题目: 修改后的汉罗塔的规则:现在限制不能从最左侧的塔直接移动到最右侧,必需要经过中间;同时从最右侧移动到最左测试,同样必需经过中间;要求移动N层塔时,打印最优移动 1、用递归函数实现(从最左移动到最右...层塔移动到右边,然后移动第N层塔到中间,再将1~N-1层塔移动到最左边,将N层塔由中间移动右边;这样,第N层塔就移好了 – 接下来重复上述步骤,将1~N-2层塔移到最右边,将第N-1层塔移到最中间……(利用递归函数实现...分析: 我们上面用递归实现,我们已经知道了基本的走法,接下来我们用来模拟汉罗塔问题,将塔的移动转换为入和出的操作,但是,由题我们知道了参数入和出的两个基本规则 小压大问题,即只有当要入的参数小于顶元素...,这时我们才能入 动作不想临,题目要求我们实现最优移动,所以我们从左移动到中间,下一步将它从中间右移动到左边,是没有意义的 满足了以上两条规则,我们现在看移动的过程,一个塔a,只有四中可能的动作,从左到中...发布者:全程序员长,转载请注明出处:https://javaforall.cn/183281.html原文链接:https://javaforall.cn

41810

了解递归:普通函数递归和非递归式实现之间的区别

相关链接 : 递归的关系 以树的遍历为例 先序遍历: 伪代码 void preView(Node node){ print(node.value);  // 1 if(node.left...这里的问题就是:帧无法为我们提供足够的信息,让我们正确的继续用执行递归。 如果编译器编译上述的伪代码,那么在函数帧中会保存要返回的地址。...比如一个int变量,如果左子节点已入,但右子未入,就标记为1。0表示均未递归调用左右子节点,2表示都调用过。...递归子函数的帧弹出后,返回到针对当前节点的帧:有以下情况 0,如果这个int变量为0,则左右子节点都未被递归调用 1,如果这个int变量为1,则把右子节点对应帧入,并且把当前帧中这个int变量修改成...其实在知道左子节点入了,但右子节点未入后,没必要保存当前帧,因为上述伪代码对右子节点的递归是尾递归,即当前函数递归调用当前函数,但是并不期待这个递归调用 给当前的函数带来些什么,递归调用也用不到当前函数

88130

论 : 递归式访问,如何用实现所有递归操作(幼儿园题目篇,题目3)

上一篇 : 论 : 递归式访问,如何用实现所有递归操作(幼儿园题目篇,题目2) 题目3 这一题,乍一看和之前题目间明显的区别是什么呢?...如果我们在递归中把对子函数的调用放在最前面,把对自己的处理放在最后边(正如后序遍历)。...但是要时刻注意,无论是递归还是我们的式实现,最终只能有一套方法处理帧,我们的父子帧交流也只有一套。怎么设计这一套交流机制呢?...如果没有的话可以先试试写下递归来实现。...4.减少帧中的变量,如果这些变量在递归函数的调用中作为形参时不会变,或者变得很少。

51010

论 : 递归式访问,如何用实现所有递归操作(幼儿园题目篇,题目2)

上一篇 : 论 : 递归式访问,如何用实现所有递归操作(幼儿园题目篇) 题目2 题目2和题目1最大的不同点是访问顺序变了。...我们对应的伪代码应该如下:   1,2,3表示的是先递归读取左子树,再是右子树,最后读取自己   void postOrderRead(BiTree tree){     if(tree == NULL...),要等待子函数出, 操作完3之后才能出。...如果我们现在我们从中访问了一个节点(注意是访问,不是弹出,因为父帧不能随意弹出),因为是后序遍历,所以要访问左子树先 也就是执行1处,所以总是要把包含左子节点的帧入。...: 递归式访问,如何用实现所有递归操作(幼儿园题目篇,题目3) 护眼绿: 没人看的结语: 首先很感谢你看到这里,辛苦了。

33820

听说递归能做的,也能做!

二叉树的迭代遍历 看完本篇大家可以使用迭代法,再重新解决如下三道leetcode上的题目: 144.二叉树的前序遍历 94.二叉树的中序遍历 145.二叉树的后序遍历 为什么可以用迭代法(非递归的方式...我们在与队列:匹配问题都是的强项中提到了,递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用中,然后递归返回的时候,从顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因...前序遍历是中左右,每次先处理的是中间节点,那么先将跟节点放入中,然后将右孩子加入,再加入左孩子。 为什么要先加入 右孩子,再加入左孩子呢?因为这样出的时候才是中左右的顺序。...其他语言版本 Java: // 前序遍历顺序:中-左-右,入顺序:中-右-左 class Solution { public List preorderTraversal(TreeNode...stack.append(node.right) # 将最终的数组翻转 return result[::-1] 旧文链接:二叉树:听说递归能做的

48420

java递归查询父节点_java递归例子

大家好,又见面了,我是你们的朋友全君。 一、需求 项目里要让用户能够设置所选择教材的章课节,以针对章课节提供相应的题目供用户做题。 设计:用户设置了教材后,首次登录,进行章节设置时。...数据库设计:此处将章课节所有信息存放到一张表中,可递归查询。最上一级章的parentid是教材的id。故给一个教材id便可以查找到其下所有的章课节信息。...那么对于默认第一章第一课第一节,我们这里使用一个递归函数将查询的结果存放到一个list中 /*** 根据给定的id,查询其下的第一课、第一节(不只适用于章课节三级,如果下面还有级别的目录,也可查 * *...= null) { list.add(c); getSubChapter(c.getId(), list);//递归查询 } } }catch(Exception e) { logger.error...(e.getMessage(),e); } } 递归查询的特点:函数方法自己掉用自己,通过某个条件判断跳出最后一个被调用的递归方法。

2.2K10
领券