爬楼梯

来源:互联网 发布:kdl32w600d安装软件 编辑:程序博客网 时间:2024/06/02 12:07
/*
   You are climbing a stair case. It takes n steps to reach to the top.


   Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
 */


分析归纳。
f(1) -- s1,=1
f(2) -- s1,s2  =2
f(3) -- s1,s2,s3 =3
f(4) -- s1,s2,s3,s4  =5
f(5) -- s1,s2,s3,s4,s5 =8
...
f(n) -- =f(n-1)+f(n-2)


分析走法,就需要加符号,比如对:s1,s2,s3,s4:
s1,s2,s3,s4
(s1,s2),s3,s4
s1,(s2,s3),s4
s1,s2,(s3,s4)
(s1,s2),(s3,s4)
有且只有5种走法。


最终递推公式:
f(n)= 1, n=1
 2, n=2
 f(n-1)+f(n-2), n>2


* 方法一:依据递推公式,使用递归的办法。
* 实现简单简洁,但多重的出入栈,性能损耗很大。


* 方法二 :迭代。
* 使用f(n)=f(n-1)+f(n-2)递归,会出现计算超时而通不过评测系统。
* 递归是从大到小(再回去),迭代则从小到大。

* 使用while循环,t = t1+t2,再改变t1跟t2的值,再次循环。循环结束条件i<=n。


// 递归

#include <stdio.h>

int climbStairs(int n) { 
    if (n == 1) {
return 1;

if (n == 2) { 
   return 2; 

return climbStairs(n-1) +climbStairs(n-2);



int main(int argc, char *argv[])
{
int n = 5;
printf("%d:%d\n", n, climbStairs(n));
return 0;

}


// 迭代

#include <stdio.h>

int climbStairs(int n) { 
int t1 = 1;
int t2 = 2;
if (n == 1) { 
   return t1; 

else if (n == 2) { 
   return t2; 

int t = 0;
int i = 3;
while (i <= n) {
t = t1 + t2;
t1 = t2;
t2 = t;
i ++;
}
return t;
}


int main(int argc, char *argv[])
{
int n = 44;
printf("%d:%d\n", n, climbStairs(n));
return 0;
}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 养老保险领了几个月就挂了怎么办 高铁餐吧乘务员东西卖不出去怎么办 铁路局如果查出有乙肝怎么办 在火车站丢了东西怎么办 在新乡火车站丢了东西怎么办 自己的行李忘到高铁安检怎么办 高铁二等座睡觉怎么办 空少岁数大了怎么办 美国留学生办欧洲签证怎么办 苏州小区不让装充电桩怎么办 饿了么运力不足怎么办 书法落款写偏了怎么办 辐射4运行不流畅怎么办 vgs币忘了映射怎么办 货车把我的货物运输中损坏怎么办 道路货物运输从业资格证过期怎么办 高铁喷雾被扣了怎么办 宝宝不好好吸奶怎么办 宝宝不用劲吸奶怎么办 刚出生的宝宝不吃奶怎么办 老婆怀孕想吐怎么办呢 菜把下水道堵了怎么办 一楼厕所堵了怎么办 农村房屋确权有争议怎么办 盲审一个没过怎么办 本科生论文盲审不过怎么办 本科盲审没通过怎么办 一篇论文多次引用著作怎么办 学生毕业后改名学籍怎么办 大学毕业后改名字后学籍怎么办 考科目三下暴雨怎么办 挂科太多拿不到毕业证怎么办 挂科太多不给毕业证怎么办 大专毕业拿不到毕业证怎么办 高考差一分二本怎么办 3个月宝宝大小眼怎么办 华东交大理工学院没有评教怎么办 学校断4g网怎么办 学校移动4g网卡怎么办 没上专科线怎么办福建 联考没过本科线怎么办