zoukankan      html  css  js  c++  java
  • 递归

    递归简单的理解就是自己调用自己,注意递归的条件,否则会造成一直递归,栈溢出.

    用递归的方式来算出斐波那契数列的值

     public static int fib(int n){
            if(n <= 2) return 1;
            return fib(n-2) + fib(n-1);
        }

    这种方法有很大的缺点,会重复调用函数.比如求fib(5),把它分成fib(4)+ fib(3),fib(4)又会分成fib(3)+fib(2)。这样就会重复调用两次fib(3);

    改进的方式

     

     public static int fib1(int n){
            if(n <= 2 ) return 1;
            int[] array = new int[n+1];
            array[1] = 1;
            array[2] = 1;
            return fib1(n,array);
        }
    
        public static int fib1(int n , int[] array){
            if(array[n] == 0){
                array[n] = fib1(n-1,array)+fib1(n-2,array);
            }
            return array[n];
        }

    通过用数组来记录值的方式,就可以避免重复调用,只要数组里有值,就不需要在递归求值,直接返回数组里面的值就可.

    采取非递归的方式

     public static int fib2(int n){
            int[] array = new int[n+1];
            array[1] = array[2] = 1;
            for (int i = 3 ; i <= n ; i++){
                array[i] = array[i-1] + array[i-2];
            }
            return array[n];
        }
     public static int fib3(int n){
            int[] array = new int[2];
            array[0] = array[1] = 1;
            for (int i = 3 ; i <= n ; i++){
                array[i & 1] = array[(i-1) & 1] +array[(i-2) & 1];
            }
            return array[n & 1];
        }

    此方法只需要数组长度为2即可,重复利用.

     public static int fib4(int n){
            int first  = 1;
            int second = 1;
            for(int i = 3 ; i <= n ; i++){
                second = first + second;
                first = second - first;
            }
            return second;
        }

    直接利用两个变量来存取值、

  • 相关阅读:
    C#中关于DBNULL的处理方法
    html 点击复制
    AJAX的简洁写法
    PHP 数组模糊查询
    PHP二维数组搜索返回数组
    php 数组排序得方法
    PHPExcel的使用
    使用PHPword中文乱码并且下载的方法
    关于多图上传的修改的操作
    把一个表里的两列或者三列合并为一行
  • 原文地址:https://www.cnblogs.com/lzh66/p/13348204.html
Copyright © 2011-2022 走看看