C语言 代码 每次可走1级或2级或3级台阶,n级台阶 有多少种走法?用户输入n表示台阶数,请输出不同走法的数量
时间: 2023-05-31 18:07:57 浏览: 87
这是一个算法问题,可以使用递归或动态规划来求解。以下是一个使用动态规划的解法:
```
#include <stdio.h>
int countWays(int n) {
int dp[n+1];
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-2] + dp[i-3];
}
return dp[n];
}
int main() {
int n;
printf("请输入台阶数:");
scanf("%d", &n);
printf("不同走法的数量为:%d", countWays(n));
return 0;
}
```
这个程序可以计算出从第一个台阶到第n个台阶的不同走法数量,其中每次可以走1级、2级或3级台阶。
相关问题
C语言 代码 递归求解 每次可走1级或2级或3级台阶,n级台阶 有多少种走法?用户输入n表示台阶数,请输出不同走法的数量
这是一个经典的递归问题。可以定义一个递归函数,使用分治思想,将问题分解为规模更小的子问题,直到问题规模足够小,可以直接求解,然后将不同子问题的结果合并。
以下是一个基于递归的解法:
```c
#include <stdio.h>
int countWays(int n) {
if (n == 0 || n == 1) {
return 1; // 只有0级或1级台阶时,只有一种走法
}
else if (n == 2) {
return 2; // 2级台阶时,有两种走法:一步一步走或一步两步走
}
else {
// 对于n级台阶,可以先走1级,剩下的问题转化为(n-1)级台阶的情况;
// 或者先走2级,剩下的问题转化为(n-2)级台阶的情况;
// 或者先走3级,剩下的问题转化为(n-3)级台阶的情况。
// 将三种情况的结果相加,就是n级台阶的总走法数。
return countWays(n-1) + countWays(n-2) + countWays(n-3);
}
}
int main() {
int n;
printf("请输入台阶数:");
scanf("%d", &n);
printf("%d级台阶有%d种不同的走法", n, countWays(n));
return 0;
}
```
这个解法的时间复杂度为O(3^n)。可能随着n的增长而变得非常缓慢。如果要解决更大规模的问题,可以考虑迭代法或动态规划。
30级台阶,每次上一个或三个总共几种走法用c语言实现
这是一个典型的动态规划问题,可以使用递归或循环来实现。以下是使用循环的C语言代码:
```c
#include <stdio.h>
int countWays(int n) {
int dp[n+1];
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-3];
}
return dp[n];
}
int main() {
int n = 30;
int ways = countWays(n);
printf("Total ways to climb %d stairs: %d\n", n, ways);
return 0;
}
```
输出结果为:
```
Total ways to climb 30 stairs: 1346269
```