zoukankan      html  css  js  c++  java
  • 跳台阶

    题目描述
    一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

    分析
    设有n级台阶时有跳法f(n)种,当n>2时,第一次跳台阶可以跳一阶,此时跳法数目等于后面n-1级台阶的跳法f(n-1);当第一次跳二阶,此时跳法数目等于后面n-2级台阶的跳法f(n-2)。所以f(n)=f(n-1)+f(n-2)。由此可以看出这是斐波那契数列的应用。将斐波那契数列向前移了一位。

        public int JumpFloor(int target) {
    
        	if(target <= 2) {
        		return target;
        	}
        	
        	int t1 = 1;
        	int t2 = 2;
        	int temp = 0;
        	for (int i = 3; i <= target; i++) {
    			temp = t1 + t2;
    			t1 = t2;
    			t2 = temp;	
    		}
        	
        	return temp;
        	
        }
    
    扩展题目

    变态跳台阶
    题目描述
    一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

    分析
    对于一级台阶,可以跳f(1) = 1种跳法
    对于二级台阶,他可以跳一级或两级,f(2) = f(2-1)+f(2-2)
    对于三级台阶,他可以跳1级,2级,3级。那么就是第一次跳出1阶后面剩下:f(3-1);第一次跳出2阶,剩下f(3-2);第一次3阶,那么剩下f(3-3)。所以:f(3) = f(3-1)+f(3-2)+f(3-3)
    那么对于n级台阶,会有n种跳的方式,1阶、2阶…n阶,综上可以得出结论:
    {f(n)=f(n1)+f(n2)+...+f(n(n1))f(n1)=f(n2)+f(n3)...+f(1) left {egin{array}{cc} f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) \ f(n-1) = f(n-2)+ f(n-3)...+f(1) end{array} ight.
    两式相减:
    f(n) = 2 * f(n - 1)
    由此看出这是一个递归的考察

    代码

        public int JumpFloor_2(int target) {
        	
        	if(target <= 2) {
        		return target;
        	}
        	return 2 * JumpFloor_2(target - 1);
        	
        }
    

    当然也可以使用循环来进行优化:

        public int JumpFloor_2_5(int target) {
        	if(target <= 2) {
        		return target;
        	}
        	int temp = 0;
        	int oldtemp = 2;
        	for (int i = 3; i <= target; i++) {
    			temp = oldtemp * 2;
    			oldtemp = temp;
    		}
        	return temp;
        }
    
  • 相关阅读:
    java join 方法的使用
    java wait(),notify(),notifyAll()
    java volatile关键字
    java 多线程死锁
    Java Synchronized
    Java 多线程概念
    Ubunte 11.4 下安装 SSH遇到的问题
    css sprint 生成工具 bg2css
    jquery each 用法
    error BC31019 无法写入输出文件 未指定错误
  • 原文地址:https://www.cnblogs.com/lishanlei/p/10707753.html
Copyright © 2011-2022 走看看