尾递归(java)
一般递归: 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
尾递归:如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。
例如:求阶乘,fun(5)=1*2*3*4*5
java实现一般递归:
public static int fun(int n){ if(n == 1){ return n; }else{ return n * fun(n - 1); } }
拆解过程:
// fun(5); // 5 * fun(4); // 5 * (4 * fun(3)); // 5 * (4 * (3 * fun(2))); // 5 * (4 * (3 * (2 * fun(1)))); // 5 * (4 * (3 * (2 * 1)));
得到结果:120
java实现尾递归:
public static int fun(int n, int record){ if(n == 1){ return n; }else{ return n * fun(n - 1, n + record); } }
拆解过程:
// fun(5, 0); // fun(4, 5); // fun(3, 9); // fun(2, 12); // fun(1, 14); // fun(0, 15);
得到结果:120