码迷,mamicode.com
首页 > 编程语言 > 详细

尾递归和JAVA

时间:2017-10-10 21:59:53      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:code   class   pytho   阶乘   代码   python   迭代   情况   java   

简单来说,递归即是调用自己本身。所有递归都应该有至少一个基本条件,在满足基本条件时不进行递归。

给出一个递归实例:

1 int fact(int N){
2     if(N==1)
3         return 1;
4     else
5         return N*fact(N-1);
6 }        

每一个递归方法的执行都分为前进和回退两个阶段,上例中计算5的阶乘,前进阶段得到的结果是:

(5*(4*(3*(2*(1)))))

回退阶段则由内向外,依次计算括号中的值。

应用到程序中,分别对应压栈和出栈。考虑到这种做法,每次调用都会压栈出栈,效率很低。除此之外,每次递归创建新的栈在递归深度过深的时候,会引起栈溢出,也就是可以分给创建栈的内存不足的情况。尾递归的方法由此提出。

尾递归,简单来说,就是将递归语句写到最后一行且不参与任何计算。将上例改写为尾递归为:

 1 int fact(int N){
 2     if(N==1)
 3         return 1;
 4     else
 5         return fact(N-1,N);
 6 }       
 7 
 8 int fact(int N, int M){
 9     if(N==1)
10         return M;
11     else
12         return fact(N-1, N*M);
13 }    

但这要求编译器能对尾递归进行优化,每次重用或者说覆盖原来递归方法的栈,而不是新建栈。遗憾的是JAVA和python都不支持尾递归的优化,JAVA的尾递归代码与普通递归无异。可能JVM是想在出现异常时更好地输出堆栈信息的缘故。所以,JAVA中一般能用迭代就不用递归。

尾递归和JAVA

标签:code   class   pytho   阶乘   代码   python   迭代   情况   java   

原文地址:http://www.cnblogs.com/ustcwx/p/7647649.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!