1.什么情况下可以使用递归:
1)一个问题的解可以分解为几个子问题的解
2)这个问题分解之后的子问题,求解思路完全一样
3)一定有一个确定的答案,即递归的终止条件
2.以斐波那契数列为例:
private static int[] data=new int[46];
/**
* 递归
* @param n,元素个数
* @return
*/
public static int fab(int n)
{
if (n<=2)
{
return 1;
}
return fab(n-1)+fab(n-2);
}
/**
* 改善递归,用数组进行缓存计算过的值,时间复杂度降为O(n),空间复杂度仍然为:O(n)
* @param n
* @return
*/
public static int fab2(int n)
{
if (n<=2)
return 1;
if (data[n]>0)
{
return data[n];
}
int res=fab2(n-1)+fab2(n-2);
data[n]=res;
return res;
}
/**
* 非递归
* @param n
* @return
*/
public static int fab3(int n)
{
if (n<=2)
return 1;
int a=1;
int b=1;
int c=0;
for (int i=2;i<n;i++)
{
c=a+b;
a=b;
b=c;
}
return c;
}
/**
* 尾递归,将上次计算的结果传递给下次的计算,下一次计算的结果能够包含上次计算的结果,下一次计算的将结果能够包含之前计算的结果,将每个下一次的递归结果返回,层层递归。
* @param pre,上上一次运算出来的结果
* @param res,上一次运算出来的结果
* @param n, 数据个数
* @return
*/
public static int tailfab(int pre,int res,int n)
{
if (n<=2)
return res;
return tailfab(res,pre+res,n-1);
}