1. 程式人生 > >一道騰訊面試題(使用遞迴、迴圈、陣列實現上臺階方法)

一道騰訊面試題(使用遞迴、迴圈、陣列實現上臺階方法)

//一道騰訊面試題
//題目:有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");
}