跳台阶

题目描述
一只青蛙一次可以跳上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 \{\begin{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}\right.
两式相减:
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;
    }
posted @ 2019-03-19 12:46  如是说  阅读(228)  评论(0编辑  收藏  举报