zoukankan      html  css  js  c++  java
  • 递归与循环

      如果我们需要重复多次计算相同的问题,通常可以选择递归或者循环

      递归的好处是代码简洁

      但是递归也有明显的缺点:

    • 递归是由于函数调用自身,而函数调用是需要有时间和空间的消耗的。每一函数调用,都需要在内存栈中分配空间以保存参数,返回地址和临时变量,而且往栈中压入数据和弹出数据都需要时间。
    • 递归中有可能很多计算都是重复的。递归的本质是把一个大问题分解成小问题,但是多个小问题之间会有重叠的部分
    • 递归可能会引发问题:调用栈溢出。

    斐波拉契数列

    public class Exam9_Fibonacci {
        public static void main(String[] args) {
            int n=10;    
            //递归
            long start = System.currentTimeMillis();            
            System.out.println("当n= "+n+" 时的结果是 "+ Fibonacci(n));
            long end = System.currentTimeMillis();
            System.out.println("递归方式:");
            System.out.println("运行的时间是"+(end-start)+"ms");
            
            //循环
            long start1 = System.currentTimeMillis();    
            System.out.println("
    循环方式:");
            Circulation(n);
            long end1 = System.currentTimeMillis();
            System.out.println("运行的时间是"+(end1-start1)+"ms");
        }
        
    
        //利用递归方式
        private static long Fibonacci(int n) {
            if(n<=0)
                return 0;
            if(n==1)
                return 1;        
            return Fibonacci(n-1) + Fibonacci(n-2);
        }
        
        //利用循环方式
        private static long Circulation(int n) {
            
            if(n<=0)
                return 0;
            if(n==1)
                return 1;
            
            long finSOne= 0;
            long finSTwo = 1;
            long fibN= 0;
            
            for(int i=2;i<=n;i++)
            {
                fibN = finSOne+finSTwo;
                finSOne = finSTwo;
                finSTwo = fibN;        
            }
            return fibN;
        }
    }

    得到的结果是:

    n值

    最终结果

    递归方式对Fibonacci()

    方法的调用次数

    递归方法时间(ms)

    循环方法(ms)

    10

    55

    177

    1

    0

    20

    6765

    21891

    3

    0

    30

    832040

    2692537

    14

    0

    40

    102334155

    331160281

    1254

    0

    50

    12586269025

    40730022147

    150514

    0

    60

    时间太长

    明显的看出,时间复杂的:

    递归方式是以n的指数的方式递增的

    循环是O(n)

    所以,对于斐波那契数列,循环的方式更好

  • 相关阅读:
    USB Descriptors
    回车(carriage return : \r) 换行(line feed : \n)
    SQLSERVER改变已有数据表中的列
    SQLSERVER数据库中的5173错误
    SQLSERVER 在局域网使用Windows身份验证连接局域网内的另一台SQL服务器(不是域环境)
    对于索引假脱机的一点理解
    SQLSERVER备份系统数据库以及何时备份系统数据库
    SQL PROMPT5.3.4.1的一些设置选项
    设置SQLSERVER的错误日志数量和查找SQLSERVER安装错误日志
    谈谈我是如何学习SQL Server的
  • 原文地址:https://www.cnblogs.com/tech-bird/p/3857370.html
Copyright © 2011-2022 走看看