递归
递归是未知条件出发,将一个复杂问题,逐步分解为一个个简单问题。递归是借助栈的数据结构实现的,每次递归时需要自己调用自己,重复从内存中读取数据以及执行相同操作,所以在执行递归时会存在大量的内存和时间代价。
由于设计递归思想需要处理问题具有特定的执行顺序和退出条件,所有不是所有的问题都适合使用递归思想;
递推
递推则是从已知条件出发,根据数据间的数量关系得出的规律来设计算法。相较于递归,递归无需重复的读取数据,所以就性能方面,推荐将算法设计为递推。
代码范例( 以 Leetcode 70题“爬楼梯”为例 )
//递归:代码简单,但需要设计退出条件,此题不适用 if(n==1) { return 1; } if(n==2) { return 2; } return climbStairs(n-1)+climbStairs(n-2);
//递推:此题易得爬1阶与爬2阶的数量关系,适用于此题求解 int[] way=new int[n+1]; way[0]=1; way[1]=1; for(int i=2;i<=n;i++) { way[i]=way[i-1]+way[i-2]; } return way[n]; }