您的位置:首页 > 其它

算法-有n步台阶,一次只能上1步或2步,共有多少种走法

2018-01-31 15:29 393 查看
前言:

其实这个题目挺简单的,可以分分钟看懂,但是分析过程非常经典,故记录下来以后复习。

分析

1、n=0 和 n=1 的时候 并没有其他可选择的,所以可以得出f(0)=0;f(1)=1;

2、n>=2时情况就变复杂起来,但是这个时候可以操作的步骤也就2种

也就是走1步(n-1)与走2步(n-2)。所以可以得到f(n)=f(n-1)+f(n-2);

从当前状态转为下一状态的通用算法既可。

3、 验证,使用2以上的数字验证几次。

实现

实现算法往往是简单的,及时是复杂算法也花费不了太多精力,所以将问题转换为数学问题是一种很好的选择。当前这种简单算法实现方式更为简单,而且往往不止一种方式。

递归

public static int f(int n){
if(n<=2) return n;
int x = f(n-1)+f(n-2);
return x;
}


优点:可能是最好理解的算法了把。代码简单,好理解。

缺点:计算次数颇多,有很多冗余计算。

迭代

public static int f(int n){
if(n<=2) return n;
if first=1,second=2;
int third=0;
for(int i=3;i<=n;i++){
third = first+second;
first = second;
second = third;
}
return third;
}


优点: 基本没有冗余计算,效率高

缺点: 谁能一次读完就理解的?

动态规划

原文:动态规划是解决下面这些性质类问题的技术:

1. 一个问题可以通过更小子问题的解决方法来解决(译者注:即问题的最优解 包含了其子问题的最优解,也就是最优子结构性质)。

2. 有些子问题的解可能需要计算多次(译者注:也就是子问题重叠性质)。

3. 子问题的解存储在一张表格里,这样每个子问题只用计算一次。

4. 需要额外的空间以节省时间。

public static int[] A = new int[100];
public static int f(int n){
if(n<=2){
A
= n;
}
if(A
>0){
return A
;
} else {
A
= f(n-1)+f(n-2);
return A
;
}
}


虽然没弄懂为啥叫动态规划,但是代码还是很清晰的。

优点:已经计算过的结果就不需要再次计算了。空间换时间

缺点:需要额外的开销。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐