java基础-08

版权声明:中华人民共和国持有版权 https://blog.csdn.net/Fly_Fly_Zhang/article/details/83473035

递归的优缺点:

  • 递归条件: 1,趋近于某个临近值。2,循环调用自己本身。

  • 优点:代码简洁。

  • 缺点:

  • 递归由于是函数调用自身,而函数调用是有时间和空间的消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址以及临时变量,而往栈中压入数据和弹出数据都需要时间。->效率

  • .递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如fibonacci斐波那契数列的递归实现。->效率

  • 调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。->性能

递归练习:


import java.util.Arrays;
import java.util.Scanner;
//栈溢出信息;
//Exception in thread "main" java.lang.StackOverflowError
public class HomeWork {
    //for循环斐波那契前n项和。
    public static int forFeiBoNaQie(int n){
        int a=0;
        int b=1;
        int tmp;
        int sum=1;
        if(n<=0){
            return -1;
        }else if(n==1){
            return sum;
        }else {
            for (int i = 1; i < n; i++) {
              tmp=a+b;
              a=b;
              b=tmp;
              sum+=b;
            }
        }
        return sum;
    }
    //斐波那契第n项值;
    public static int diGuiFeiBoNaQieN(int n) {
        int x ;
        if (n <= 0) {
            return -1;
        } else {
            if (n == 1) {
                return x=1;
            }else if (n == 2) {
                return x=1;
            } else {
                x = diGuiFeiBoNaQieN(n - 1) + diGuiFeiBoNaQieN(n - 2);
            }
            return x;
        }
    }
    //递归查找前n项和;
    public static int diGuiFeiBoNaQieSum(int n) {//递归太慢。
        int sum=1;
        if(n==1){
            return sum;
        }else{
            sum=diGuiFeiBoNaQieSum(n-1)+diGuiFeiBoNaQieN(n);
        }
        return sum;
    }
    //普通二分法查找。
    public static int Search(int [] array,int key){
        for (int i = 0; i <array.length ; i++) {
            for (int j = 0; j <array.length-i-1 ; j++) {
                if(array[j]>array[j+1]){
                    int tmp;
                   tmp=array[j];
                   array[j]=array[j+1];
                   array[j+1]=tmp;
                  //array[j]=array[j]+array[j+1];
                   //array[j+i]=array[j]-array[j+1];
                   //array[j]=array[j]-array[j+1];
                }
            }
        }
        System.out.println(Arrays.toString(array));
        int min=0;
        int max=array.length;
        int mid=0;
        while(min<max){ //array[mid]!=key 这两个条件都可以
             mid=(max+min)>>>1;
            if(array[mid]==key){
                return mid; //break 也行。
            }else if(array[mid]>key){
                max=mid;
            }else{
                min=mid;
            }
        }
        return mid;
    }
    //选择排序
    public static int[] insertSort(int [] array) {
        int j;
        for (int i = 1; i < array.length; i++) { //insertSort.
            int tmp = array[i];
            for (j = i - 1; j >= 0; j--) {
                if (array[j] > tmp) {
                    array[j + 1] = array[j];
                } else {
                    break;
                }
            }
            array[j + 1] = tmp;
        }
        return array;
    }
    public static int diGuiSearch(int [] array,int key){
        int min=0;
        int max=array.length;
        int mid=(max+min)>>>1;
        if(array[mid]==key){
            return mid;
        }
        else if(array[mid]>key){
            return diGuiSearch(array, key);
        }else if(array[mid]<key){
            return diGuiSearch(array, key);
        }
        return mid;
    }
    public static void main (String args []){
        Scanner scanner=new Scanner(System.in);
        String str=scanner.nextLine();
        int n= Integer.parseInt(str);
        System.out.println(forFeiBoNaQie(n));
        System.out.println(diGuiFeiBoNaQieSum(n));
        int[] array=new int[]{9,8,7,6,5,4,2,6};
        int key=6;
        System.out.println(Search(array,key));
        int [] array1={9,8,7,6,5,4,2,6};
        System.out.println(diGuiSearch((insertSort(array1)),key));

    }
}

汉诺塔

public class hannio {

    public static void move(char pos1,char pos2) {
        System.out.print(pos1+"==>"+pos2 + " ");
    }

    public static void hanio(int n,char pos1,char pos2,char pos3) {
        if(n == 1) {
            move(pos1,pos3);
        } else {
            hanio(n-1,pos1,pos3,pos2);
            move(pos1,pos3);
            hanio(n-1,pos2,pos1,pos3);
        }
    }

    public static void main(String[] args) {
        hanio(1,'A','B','C');
        System.out.println();
        hanio(2,'A','B','C');
        System.out.println();
        hanio(3,'A','B','C');
    }
}

字符串的左旋和右旋以及字符子串的逆置:

public class Damo {
    public static String inversion(String str ,int begin,int end){
        char tmp;
        char [] ch=str.toCharArray();
        while (begin < end){
            tmp=ch[begin];
             ch[begin]=ch[end];
            ch[end]=tmp;
            begin++;
            end--;
        }
        return String.copyValueOf(ch);
    }
    public static char[] inversion1(char[] ch,int begin,int end){
        char tmp;
        //char [] ch=str.toCharArray();
        while (begin < end){
            tmp=ch[begin];
            ch[begin]=ch[end];
            ch[end]=tmp;
            begin++;
            end--;
        }
        return ch;
    }
    public static String left(String str,int n){
        str=inversion(str,0,n);
        str=inversion(str,n+1,str.length()-1);
        str=inversion(str,0,str.length()-1);
        return str;
    }
    public static String right(String str,int n){
     str=inversion(str,n,str.length()-1);
     str=inversion(str,0,str.length()-1);
     str=inversion(str,0,n-1);
     return str;
    }
    public static String fun(String str1){
        if(str1==null){
            return null;
        }
        char []ch=str1.toCharArray();
        ch=inversion1(ch,0,ch.length-1);
        //System.out.println(String.copyValueOf(ch));
        int i=0;
        int j=0;
        while(j<=ch.length) { //这里必须等于,否则最后的子字符串没法逆置;
            if(ch[i]==' '){
                i++;
                j++;
            }else if (j == ch.length||ch[j] == ' ') {// 判断的时候,数组越界的选项一定要放前面,并且要双或,
                ch = inversion1(ch, i, j - 1);//否则pvm还会判断后面的,这样就会造成数组越界。
                j++;
                i = j;
            } else{
                j++;
            }
        }
        return String.copyValueOf(ch);
    }
    public static void main (String args []){
        String str=new String("abcdefg");
        int n=1;
        System.out.println(right(str,n));
        String str1="tulun is here";
        System.out.println(fun(str1));
    }
}

猜你喜欢

转载自blog.csdn.net/Fly_Fly_Zhang/article/details/83473035
今日推荐