递归

递归的定义
程序调用自身的编程技巧称为递归。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
构成递归需具备的条件:
1. 子问题须与原始问题为同样的事,且更为简单;
2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
菲波那切数列
用for循环

    public static int fabonic1(int n){
        int f1=1;
        int f2=1;
        int f3=1;
        for(int i=2;i<n;i++){//n为要查找的第n项菲波那切数
            f3=f1+f2;
            f1=f2;
            f2=f3;
        }
        return f3;
    }

这里写图片描述
用递归

    public static int fabonic2(int n){//n为要查找的第n项菲波那切数
        if(n==1||n==2){
            return 1;
        }
        return fabonic2(n-2)+fabonic2(n-1);
    }

这里写图片描述
但是在斐波那契数列中,for循环比递归快很多。
汉诺塔

    public static void move(char pos1,char pos2){
        System.out.println(pos1+"--->"+pos2);
    }
    public static void hanoitower(int n,char pos1,char pos2,char pos3){
        if(n==1){
            move(pos1,pos3);//只有一块时直接从pos1挪到pos3上
        }else{
        hanoitower(n-1,pos1,pos3,pos2);//递归调用,将pos1上n-1块通过pos3挪到pos2上
        move(pos1,pos3);//将剩下的一块从pos1挪到pos3上
        hanoitower(n-1,pos2,pos1,pos3);//,将pos2上的n-1块通过pos1挪到pos3上
        }
    }
    public static void main(String[] args) {
        char pos1='A';
        char pos2='B';
        char pos3='C';
        int n=4;
        hanoitower(n,pos1,pos2,pos3);
    }

这里写图片描述
汉诺塔的时间复杂度为O(2^n)。

阅读更多
想对作者说点什么?

博主推荐

换一批

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