• 我的首页
  • 星空画廊

My thought on web

Think what ? think

优化

Java中的尾递归优化

2016年9月13日 by caoli5288 Leave a Comment

方法或者说函数的调用和返回使栈的大小增长或者收缩,而递归这种操作使得栈大小爆炸性增长,存在栈空间溢出的风险。在很多种编程语言中存在对尾递归这种特殊递归的优化机制,比如GCC编译器会把C语言中的尾递归优化成循环。而Java语言环境中无论在编译时还是在运行时都没有针对尾递归的优化,一个很简单的验证如下。

public static void main(String[] args) {
  func(1);
}

public static int func(int i) {
  return func(i + 1);
}

这段代码在我的笔记本上大概会调用一万多次,然后抛出一个‵StackOverflowError‵。是不是Java中就没有办法进行大规模递归了呢?是。但是有很多可以取巧的办法可以把递归转换成其他什么操作避免栈溢出,而代码看起来仍像递归。比如这篇文章的做法(文章本身说法有问题,实际上是Stream把递归转换成了循环+对象方法调用)。

Lambda表达式对递归的优化

再比如Groovy中的Trampoline。顺着这个思路来看其实可以达到类似的优化的办法有很多,并不是说一定要用到Stream这个东西。比如实现一个迭代器,稍微包装一下照样可以使代码看起来很像递归。

Posted in: 笔记 Tagged: java, 优化

标签

c docker dynamic fedora ffmpeg hevc java libmfx linux mingw mount mp4 NAS parallel qsv rime x264 x265 ZFS 事件 互联网 交叉编译 优化 分布式 反射 性能 文件系统 杂谈 游戏 站点 网卡 网络 自由 调优 透明代理

近期文章

  • lxc安装openwrt
  • NAS 文件系统方案的选择
  • 透明代理踩坑指北
  • QSV编码HEVC视频参数测试
  • FFmpeg中的几个新视频降噪滤镜

友情链接

  • 梦之地
  • Vultr

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org

文章归档

Copyright © 2021 My thought on web.

Omega WordPress Theme by ThemeHall