首页 > 代码库 > java栈和递归的关系

java栈和递归的关系

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

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

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

  2.分配栈空间

  3.准备被调用

  出栈也一样:

  1.保存运算结果

  2.消除栈空间

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

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

  example:

  技术分享

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

技术分享

 

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

java栈和递归的关系