这是一个非常常见的编程题
题目是这样的:小明上楼梯,每次可以上一层,也可以上两层,那么他爬上100层有多少上楼梯的方式?(1000层...同理)
很多人一看,这个简单,递归实现啊!!!
递归的思想:
设爬上n
层的方式有f(n)
种,
那么如果最后一步只上1层的方式就有f(n-1)
种(即最后一步小明在第n-1
层,方式如假设的那样就是f(n-1)
)
如果最后一步是上了2
层的方式就有f(n-2)
则爬上第n层的方式可以最后一步只上一层,也可以2层,即:f(n)=f(n-1)+f(n-2)
#include<iostream>
using namespace std;
unsigned int Func(unsigned int n)
{
if ((0==n)|| (1==n)|| (2==n))
{
return n;
}
return Func(n-1)+Func(n-2);
}
int main()
{
unsigned int num = 100;
cout<<Func(100)<<endl;
return 0;
}
但是递归的方式会造成反复的重复计算,浪费时间资源,就像计算100层,我用devC++运行跑了很长时间,既然我们知道了爬楼梯的公式,那么不妨采用迭代的方式来实现
unsigned int Func(int n)
{
if (n<0)
{
exit(1);
}
if((0==n) || (1==n) || (2==n))
{
return n;
}
unsigned int temp1 = 1;
unsigned int temp2 = 2;
unsigned int temp = 0;
unsigned int num = n;
while (num >=3)
{
temp = temp1 + temp2;
temp1 = temp2;
temp2 = temp;
num --;
}
return temp;
}
网友评论