您的位置:首页 > 编程语言 > C语言/C++

【C语言】20个阶梯,一次只能走1或2阶,有多少种走法

2020-04-01 19:15 1086 查看

【C语言】20个阶梯,一次只能走1或2阶,有多少种走法。

/* 有20阶阶梯,一次只能上1或2阶阶梯,问有多少种走法的求解 */

/*
分析:
一阶阶梯的时候只有一种走法,
两阶阶梯的时候有两种走法,
三阶的时候,假设第一下跨了两阶,那还剩一阶阶梯,走法数与只有一阶的时候相同;
假设第一下跨了一阶,还剩两阶,走法数与有两阶的时候相同;
那三阶的时候就是两阶的走法数加上一阶时的走法数。
以此类推。

PS:实际上分析过来就是斐波那契数列。

代码实现:
可以有递归与动态规划两种方法。
------------更新-----------22.12.2019----------
也可以使用迭代。
x = 1;
y = 1;
for(.......){
x = x + y;
y = x + y;
}
递归:
设n阶时走法数为f(n),则f(n) = f(n-1) + f(n-2)
伪代码:
int f(int n){
if(1 == n) return 1;
if(2 == n) return 2;
return f(n - 1) + f(n - 2);
}

动态规划:
设n阶时走法为seq[n - 1],则seq[0] = 1;seq[1] = 2;
seq
 = seq[n - 1] + seq[n - 2];
*/

#include <stdio.h>
#include <stdlib.h>

/* 动态规划实现 */
int dpSeq(int n){

int *seq = (int*)malloc(sizeof(int) * n);
seq[0] = 1;
seq[1] = 2;

for (int i = 2; i < n; ++i)
seq[i] = seq[i - 1] + seq[i - 2];

int mid = seq[n - 1];
free(seq);

return mid;
}

/* 递归实现 */
int stackSeq(int n){

if(1 == n) return 1;
if(2 == n) return 2;
return stackSeq(n - 1) + stackSeq(n - 2);
}

int main(int argc, char const *argv[])
{
printf("Stack: %d\n", stackSeq(20));
printf("DP : %d\n", dpSeq(20));
return 0;
}
  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
遨游太空 发布了4 篇原创文章 · 获赞 1 · 访问量 110 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐