大家做高中数学题的时候是否接触过这样一道题:一个青蛙要上一个n阶的台阶,一次可以跳一阶或者是两阶,求得是这只青蛙一共有多少种的跳法。
首先我们要对这个问题进行分析,到底该采用什么样的算法思想去进行解决,这里我们的分析思路可以是如下的:
假设我们已经知道了跳上前n-1阶台阶的数目,那么剩下的唯一一个台阶我们就只有一种跳法,假设我们知道了前n-2阶的跳法数目,那么剩下的2阶台阶就只有两种跳法,这里我们是不是已经知道这里我会采用递归的方式进行解决这个问题,下面附上相关代码,这里的代码上我是假设这只青蛙可以跳三阶的,算法思想是和上面一样,只是递归的跳出条件复杂了点而已。
public static int ClimbStairs(int n)
{
if(n == 3)
return 4;
else if(n == 2)
return 2;
else if(n == 1)
return 1;
else
return ClimbStairs(n-1)+ClimbStairs(n-2)+ClimbStairs(n-3);
}
解决了这样一个初始问题我们进行继续分析,大家如果输出不同n的次数时会明显发现这里的n的规律是服从fibonacci数列,这里大家有必要对这个经典数列进行阅读,大家或多或少会接触过这个数列,但是大家是否深入思考过,这里我附上一篇关于fibonacci的博客介绍:
fibonacci数列分析
分析过这样一个问题,我附上相关fibonacci的代码:
public static int demo(int n)
{
return (n == 1||n ==0)?1:demo(n-1)+demo(n-2);
}
下面就可以进入本篇文章的重点内容了,加入这只青蛙被打了兴奋剂,可以一下跳n阶,那么这个问题的所以跳法又会是多少呢?
我们具体的分析思路如下:
如果我们第一次跳1阶,那次数就是跳n-1阶的数目,如果我们跳2阶,那么次数就会是跳n-2阶的数目,经过分析我们会发现:
f(n)=f(n-1)+f(n-2)+f(n-3)+......+f(2)+f(1)+f(0)
其中我们知道f(1)=f(0)=1
下面就是对上面的公式进行算法实现了,具体算法如下:
package jiuduOJ;
import java.util.Scanner;
/**
* 跳n阶台阶,跳的时候可以一次跳1-n个台阶,这里并没有采用递归的方法进行
*@author:Mr.wang
*@version:1.0
*@time:2015/11/4
*/
public class JumpStair_n
{
public static void main(String[] args)
{
System.out.println("请输入要爬的总台阶数目n:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
double[] f = new double[n];
f[0] = 1;
f[1] = 1;
double sum = 2;
for(int i = 2; i <= n-1; i++)
{
for(int j = 0; j <= i-1; j++)
{
f[i]+=f[j];
}
sum+=f[i];
}
System.out.println("所以的爬台阶总数为:"+sum);
}
}