• 递归与迭代


    编程题:有n步台阶,一次只能上1步或2步,共有多少中走法

    方法一:递归

    思路

    n=1 ——> 一步 ——> f(1)=1
    n=2 ——> (1)一步一步 (2)直接两步 ——> f(2) =2
    n=3 ——> (1)先到达第f(1),然后直接从f(1)直接跨2步
    (2)先到达f(2),然后直接从f(2)跨步1 f(3)=f(1)+f(2)
    n=x ——>(1) 先到达f(x-2),然后从f(x-2)直接垮2步
    (2) 先到达f(x-1),然后从f(x-1)跨1步 f(x) =f(x-2)+f(x-1)

    代码
    	public static void main(String[] args) {
            Long start = System.currentTimeMillis();
            System.out.println(f(40l));
            Long end = System.currentTimeMillis();
            System.out.println(end-start);
        }
    
        public static Long f(Long n){
            if(n <1)
                throw new IllegalArgumentException(n +"不能小于1");
            if(n == 1 || n == 2){
                return n;
            }
            return f(n-2)+f(n-1);
        }
    
    优点:代码精简 易懂,容易编写。
    缺点:开销较大,容易造成内存溢出
    

    方法二:迭代

    思路:使用one变量存储前两步的值,使用two变量存储前一步的值
    代码
    	public static void main(String[] args) {
            Long start = System.currentTimeMillis();
            System.out.println(f(40l));
            Long end = System.currentTimeMillis();
            System.out.println(end-start);
        }
    	public static Long loop(Long n){
            if(n <1)
                throw new IllegalArgumentException(n +"不能小于1");
            if(n == 1 || n == 2){
                return n;
            }
            Long one = 1l;
            Long two = 2l;
            Long sum = 0l;
    
            for(int i = 3;i<=n;i++){
                sum = one + two;
                one = two;
                two = sum;
            }
            return sum;
        }
    
    优点:速率快。
    缺点:代码不易懂。
  • 相关阅读:
    HTML文件中表格(Table)标记的常用属性
    QTP 学习
    QTP与Selenium的比较
    loadrunner简单使用——HTTP,WebService,Socket压力测试脚本编写
    linux
    linux
    AcWing1131 拯救大兵瑞恩(最短路)
    AcWing341 最优贸易(spfa+dp思想)
    AcWing342 道路与航线(最短路+DAG)
    AcWing340 通信线路
  • 原文地址:https://www.cnblogs.com/shaoyu/p/12418607.html
Copyright © 2020-2023  润新知