递归简介
详细规则等,见递归简论
递归简而言之即为自己调用自己。
最不适合递归之斐波拉契
递归解法
public static int fabonic(int n)
{
if(n==1||n==2)
return 1;
else
return fabonic(n-1)+fabonic(n-2);
}
非递归解法
public static int fabonic1(int n)
{
int f1 =1,f2=1;
int f3 = 0;
for (int i = 2; i < n; i++) {
f3 = f1+f2;
f1 = f2;
f2 = f3;
}
return f3;
}
递归算法看起来简洁,比非递归短好多,可是在计算机中递归方法需要的时间,花费的空间却是非递归的好多倍
同样求斐波拉契的第40个数
102334155
非递归0
102334155
递归305
明显可以看出非递归在计算机中运行不到1ms,递归确将近305ms。
怎么也搬不完的汉诺塔
/**
* 移动
* @param p1 从
* @param p2 到
*/
public static void move(char p1,char p2)
{
System.out.println(p1+"------->"+p2);
}
/**
*
* @param n 移动盘子数
* @param p1 从
* @param p2 借助
* @param p3 到
*/
public static void hanoi(int n,char p1,char p2,char p3)
{
if(n==1)
{
move(p1,p3); //当只有一个盘子只需要从1 - 3
}
else
{
hanoi(n-1, p1, p3, p2); //需要把n-1个盘子先移动到2
move(p1,p3); //然后把一个盘子从1移动到3
hanoi(n-1, p2, p1, p3); //再把n-1个盘子移动到从2移动到3
}
}
由以上动图就可以看出来,汉诺塔的移动主要分为3个部分,先把n-1个盘子移动到2,再把最后一个盘子从1移动到3,再把剩余的n-1个盘子从2移动到3。