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;
        }
    
  • 相关阅读:
    01 Jq 基础
    01 属性
    input 编辑框 光标 的相关问题
    登录页面 文字 2 3 4 个字 等宽俩端对齐 空格
    复选框单选框与文字对齐问题的研究与解决
    在Python中对MySQL中的数据进行可视化
    输入2个坐标的数值求出对应坐标间的距离和圆的面积
    numpy中arange函数内起始值必须大于结束值,否则生成为空的一维数组
    条件语句练习-比分预测
    三元表达式是棒棒哒!
  • 原文地址:https://www.cnblogs.com/lishanlei/p/10707753.html
Copyright © 2011-2022 走看看