您的位置:首页 > 其它

爬楼梯

2016-05-16 09:38 363 查看
/*

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: