java栈和递归的关系

  最近看了Mark.Allen.Weiss的算法与数据结构,看到了里面讲述的表、栈和和队列,结合最近工程用的比较多的递归运算。所以这里讲一下递归

  因为在年初的时候看了《大话数据结果》(推荐看一下),这里先讲一下概念:函数的递归调用和普通函数调用是一样的,当程序执行到某个函数时,将这个函数进行入栈操作,入栈之前主要做三件事

  1.把入参,返回地址等返回给被调用函数保存

  2.分配栈空间

  3.准备被调用

  出栈也一样:

  1.保存运算结果

  2.消除栈空间

  3.把运算结果放到栈空间出口

  所以递归这种存储某些数据,并在后面又以存储的逆序恢复这些数据,以提供之后使用的需求,显然很符合栈这样的数据结构,因此,编译器使用栈实现递归就没什么好惊讶的了。

  example:

  

  这种程序称为尾递归使用不当的例子。尾递归设计在最后一行的递归调用。尾递归可以通过讲代码放到一个while循环中并用每个方法参数的一次赋值代替递归调用而被手工删除。下面是去除递归之后的写法

  其实在代码运算的过程中,递归总总能够被彻底去除(编译器是在转变成汇编语言时完成递归去除的);但是这么做是相当冗长乏味的。一般方法要求使用一个栈,而且仅当你能够把最低限度的最小值放到栈上时这个方法才值得一用。

时间: 2024-10-26 21:29:24

java栈和递归的关系的相关文章

栈和递归的关系 144:Binary Tree Preorder Traversal

前序遍历:根左右 //用栈来实现非递归解法/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> preorderTraversal(T

栈与递归

今天说的是栈与递归的关系,函数的递归调用和普通函数调用是一样的.当程序执行到某个函数时,将这个函数进行入栈操作,在入栈之前,通常需要完成三件事. 1.将所有的实参.返回地址等信息传递给被调函数保存.(输入参数和标记返回值地址) 2.为被调函数的局部变量分配存储区.(分配局部变量地址空间) 3.将控制转移到北调函数入口.(给予控制权) 当一个函数完成之后会进行出栈操作,出栈之前同样要完成三件事. 1.保存被调函数的计算结果.(返回值) 2.释放被调函数的数据区.(释放局部变量地址空间) 3.依照被

java 栈 和 堆 的区别

转载: 一.java栈 Java 栈总是和线程关联在一起,每当创建一个线程时,JVM就会为这个线程创建一个对应的Java栈,在这个Java栈中又会含有多个栈(Frames),这些栈帧是与每个方法关联起来的,每个运行一个方法就创建一个栈帧会含有一些“内部变量"(在方法内定义的变量)."操作栈"和"方法返回值"等信息. 二.堆 堆是存储Java 对象的地方,它是JVM管理 Java 对象的核心存储区域,堆是 Java 程序员最应该关心的,因为它是我们的应用程度

深度优先搜索入门:POJ1164城堡问题(递归、用栈模拟递归)

将问题的各状态之间的转移关系描述为一个图,则深度优先搜索遍历整个图的框架为:Dfs(v) {if( v 访问过)return;将v标记为访问过;对和v相邻的每个点u: Dfs(u);}int main() {while(在图中能找到未访问过的点 k) Dfs(k);} 例题: POJ1164 The Castle Description 1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#-

从几个sample来学习JAVA堆、方法区、JAVA栈和本地方法栈

最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程,大部分的程序员在写程序时不会太关注Java运行时数据区域的结构: 感觉有必要通过几个实在的例子来加深对这几个区域的了解 1)Java堆 所有对象的实例分配都在Java堆上分配内存,堆大小由-Xmx和-Xms来调节,sample如下所示: [java] view plaincopyprint? public class HeapOOM { static class OOMObjec

java和javascript真的有关系=。=

相同点:1. 内存管理,两者都采用GC来对内存进行回收.因此Java与javascript的内存泄露情况十分相似. 2. 代码编译为机器码后由中间件执行:Java使用前会编译为字节码后由JVM执行,V8引擎采用JIT将js编译为机器码后由引擎执行. 3. 内存申请,对象(Object)与数组(Array)引用申请自栈(stack),其本身空间申请自堆(heap). 4. hash处理,对数组与对象来说,数字类型键值的hashCode为其本身,字符串类型键需要计算hashCode来找到对应的值,因

java虚拟机 jvm java堆 方法区 java栈

java堆是java应用程序最密切的内存空间. 差点儿全部的对象都存在堆中.java堆全然自己主动化管理,通过垃圾回收机制,垃圾对象会自己主动清理.不须要显式释放. 依据java垃圾回收机制的不同.java堆可能有不同的结构. 最常见的是将整个java堆分为新生代和老年代.跟人类几乎相同了.老龄化就有可能找上帝去了,新生代存放新对象或者年龄不大的对象,老年代存放老年对象.新生代有可能分为eden区.s0区和s1区,s0区和s1区也被称之为 from 到to区域.他们是两块大小相等能够互换的内存空

数据-第18课-栈与递归

第18课-栈与递归 C语言中的疑惑 讨论中…… 小A:C语言中常说“局部变量在栈上分配空间”,那么这个地方的“栈”和我们之前学习的栈数据结构有关系吗? 小B:我觉得应该没关系吧 :我觉得应该没关系吧,只是名称碰巧一致而已吧?! 1. 函数调用时的栈 (1)程序中的“函数调用栈”是栈数据结构的一种应用. (2)函数调用栈一般是从高地址向低地址增长的. l  栈底为内存的高地址处. l  栈顶为内存的低地址处. (3)函数调用栈中存储的数据为活动记录 2. 活动记录 活动记录是函数调用时一系列相关信

Atitit 表达式原理 语法分析&#160;原理与实践 解析java的dsl &#160;递归下降是现阶段主流的语法分析方法

Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析方法2 递归下降是现阶段主流的语法分析方法,2 于是我们可以把上面的语法改写成如下形式: 1)       Operator="+" | "-" | "*" | "/" 2)       Expression=<数字>