一道腾讯面试题(使用递归、循环、数组实现上台阶方法)
程序员文章站
2022-06-04 18:25:47
...
//一道腾讯面试题
//题目:有50个台阶,一次走一步或者两步,有多少种可能?
分析:
如果有一个台阶,则只有一种可能:1;
如果有两个台阶,只有两种可能:11或2;
如果有三个台阶,则有三种可能:111,12,21;
如果有四个台阶,则有五种可能:11111,1112,1121,1211,2111
因为第三个及其后面的台阶只能从前面一次走一步或者一次走两步走上来,则可知走到第三个台阶的可能性等于走上第一个台阶的可能性加上走上第二个台阶的可能性;走到第四个台阶的可能性等于走上第二个台阶的可能性加上走上第三个台阶的可能性;以此类推,走上第50个台阶的可能性等于走上第48个台阶的可能性加上走上第49个台阶的可能性。
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//任何循环都能转换为递归,但是递归不一定能转换为循环
int step(int steps) //数值较大(台阶数目较多)计算较慢,例如50个台阶
{
if (steps == 1)
{
return 1;
}
else if (steps == 2)
{
return 2;
}
else
{
return step(steps - 1) + step(steps - 2);
}
}
//使用for循环
int tencent(int steps)
{
if (steps == 1)
{
return 1;
}
else if (steps == 2)
{
return 2;
}
else
{
int step1 = 1;
int step2 = 2;
int step;
for (int i = 3; i <= steps; i++)
{
step = step1 + step2;
step1 = step2;
step2 = step;
}
return step;
}
}
//使用数组实现
int tencentSteps(int steps)
{
int step[50]; //50,只是使用一个足够大的数
step[0] = 1;
step[1] = 2;
for (int i = 2; i <= steps - 1; i++)
{
step[i] = step[i - 1] + step[i - 2];
}
return step[steps - 1];
}
void main()
{
int key;
scanf("%d", &key);
printf("递归:有%d种方法\n", step(key));
printf("循环:有%d种方法\n", tencent(key));
printf("数组:有%d种方法\n", tencentSteps(key));
system("pause");
}