一道腾讯面试题(使用递归、循环、数组实现上台阶方法)

//一道腾讯面试题
//题目:有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");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值