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。

阅读更多

扫码向博主提问

咸鱼塘塘主

沉迷学习
去开通我的Chat快问
版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/qq_38345606/article/details/79968808
个人分类: 零基础学Java Java
所属专栏: 咸鱼学Java
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭