java递归栈_java栈和递归的关系

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

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

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

2.分配栈空间

3.准备被调用

出栈也一样:

1.保存运算结果

2.消除栈空间

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

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

example:

ba28a2fa4ed6124c93e498b521dbc00b.png

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

141f587d503f071fddb4ee4b0f2be2b3.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值