论坛首页 Java企业应用论坛

如果要用java实现算法,一定慎用递归

浏览 13042 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (9) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-04-07  
我尝试了一下,到5000还是可以用递归的。但是50000就报栈溢出异常了。感觉这种太深层次的递归还是函数化语言使用更好。
0 请登录后投票
   发表时间:2011-04-07  
递归必须慎重使用。
如果可以用非递归方法相对简洁的使用,就不用递归。
说到底是数据结构教材里的阶乘和裴波拿切数列的递归实现误导了许多人,
这两者最好还是用非递归实现。
0 请登录后投票
   发表时间:2011-04-07  
kimmking 写道
cttnbcj 写道
除非疯子才一个一个算logx相加 .......
向楼上所说递归是用来简单化来表达数据处理的思想

要是不用递归试试计算 f(n)=f(n-1)+f(n-2)+f(n-3)+f(n-4)+f(n-5)
不管是用非递归或推数学公式(上面公式已经要计算一元五次方程的解了),会非常复杂

五次方程没有根式解,
手工计算5个根有点累。
计算机计算起来比较容易。

你确定无解?只是无代数根式解
五次方程符合Galois群理论,就可以有解。。。。(x-a)(x-b)(x-c)(x-d)(x-e)=0 a,b,c,d,e都不相等,这个五次方,你说有解吗?
0 请登录后投票
   发表时间:2011-04-07  
cttnbcj 写道
kimmking 写道
cttnbcj 写道
除非疯子才一个一个算logx相加 .......
向楼上所说递归是用来简单化来表达数据处理的思想

要是不用递归试试计算 f(n)=f(n-1)+f(n-2)+f(n-3)+f(n-4)+f(n-5)
不管是用非递归或推数学公式(上面公式已经要计算一元五次方程的解了),会非常复杂

五次方程没有根式解
手工计算5个根有点累。
计算机计算起来比较容易。

你确定无解?只是无代数根式解
五次方程符合Galois群理论,就可以有解。。。。(x-a)(x-b)(x-c)(x-d)(x-e)=0 a,b,c,d,e都不相等,这个五次方,你说有解吗?

0 请登录后投票
   发表时间:2011-04-07  
cttnbcj 写道
除非疯子才一个一个算logx相加 .......
向楼上所说递归是用来简单化来表达数据处理的思想

要是不用递归试试计算 f(n)=f(n-1)+f(n-2)+f(n-3)+f(n-4)+f(n-5)
不管是用非递归或推数学公式(上面公式已经要计算一元五次方程的解了),会非常复杂


你根本就不理解本帖子要说明什么! 只是想说明递归的开销!
例子不是最重要的,"除非疯子才一个一个算logx相加 ....... "这个大家都懂得,不要过分去在意这个。
0 请登录后投票
   发表时间:2011-04-07  
每每看到递归都后怕,StackOverflowError是个心理阴影
0 请登录后投票
   发表时间:2011-04-07  
在Sun JDK 下跑,第一次确实差距挺大,再运行第二次的结果(也许可能要多运行几次):

recursive result:7.212475098340103E7
recursive time used:312802755
non-recursive result:7.212475098340103E7
non-recursive time used:312842609

JDK 对尾递归还是会自己做优化的
0 请登录后投票
   发表时间:2011-04-07  
递归 代码比较整洁

空间消耗代价
0 请登录后投票
   发表时间:2011-04-07  
递归是用来简化求解难度的
但如果迭代次数过多的话,会影响性能
0 请登录后投票
   发表时间:2011-04-07  
不是递归本身慢, 是java调用方法慢, 例子1跟例子2的区别在于例子2少调用了方法, 这两个例子都运行几次就会发现两个耗时会越来越接近, 因为java对频繁调用的方法进行优化~
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics