递归
递归的特点
- 终止条件:递归必须有一个终止的条件,即不能无限循环地调用本身。
- 自身调用:原问题可以分解为子问题,子问题和原问题的求解方法是一致的,即都是调用自身的同一个函数
public class T { public static void main(String[] args) { System.out.println(recursion(4)); System.out.println(tailrecursion(4, 1)); } /** * 递归 */ static int recursion(int n) { int result = 0; if (n == 1) { return 1;//recursion(1)=1 } else { result = n * recursion(n - 1); /* recursion(4)=4*recursion(3) recursion(3)=3*recursion(2) recursion(2)=2*recursion(1) recursion(1)=1 * */ } return result; } /** * 尾递归 */ static int tailrecursion(int n, int result) { if (n == 1) { return result; } /** * tailrecursion(4)=tailrecursion(4-1,4*1) * tailrecursion(3)=tailrecursion(3-1,4x*1*3) * tailrecursion(2)=tailrecursion(2-1,4x*1*3*2) * tailrecursion(1,4x*1*3*2) */ return tailrecursion(n - 1, n * result); } }
递归执行过程
尾递归执行过程
当递归调用是函数体中最后执行的语句并且它的返回值不属于表达式一部分时, 这个递归就是尾递归。
