爬楼梯
来源:互联网 发布: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)递归,会出现计算超时而通不过评测系统。
* 递归是从大到小(再回去),迭代则从小到大。
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