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;
        }

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

  • 相关阅读:
    React项目安装过程及node版本太老引发问题
    利用git上传、拉取代码,密码和用户名字不正确时,如何操作
    Vue和react的优缺点
    同步异步差别
    深拷贝和浅拷贝区别
    vue项目引用Swiper.js在低版本浏览器出现错误
    uniApp h5分享实现
    input上传图片样子太丑了,实现美化的tips
    关于cli3.0跨域的处理
    webpack4.0
  • 原文地址:https://www.cnblogs.com/lzh66/p/13348204.html
Copyright © 2011-2022 走看看