13-咸鱼学Java-递归与斐波拉契,汉诺塔

递归简介

详细规则等,见递归简论
递归简而言之即为自己调用自己。

最不适合递归之斐波拉契

递归解法

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值