一道编程题目,求算法有n级台阶,每次可以走1级或者2级,求有多少种走法希望算法尽可能的有效率,谢谢了![解决
一道编程题目,求算法
有n级台阶,每次可以走1级或者2级,求有多少种走法
希望算法尽可能的有效率,谢谢了!
[解决办法]
裴波那契数列啊。
[解决办法]
#include <stdio.h>
int step(int n)
{
if(n == 1
[解决办法]
n == 2)
return 1;
return step(n - 1) + step(n - 2);
}
int main(void)
{
int i;
for(i = 1; i < 30; i++)
printf("%d\n", step(i));
return 0;
}
[解决办法]2阶台阶有二种走法。
上n阶台阶有两种方法:
方法1:先上n-1阶台阶,再上第n阶
方法2:先上n-2阶台阶,然后还有两种走法(一阶一阶上,两阶一起上)
所以应该是:
int func( int n )
{
int result;
if( n == 1 )
{
result = 1;
}
else if( n == 2 )
{
result = 2;
}
else
{
resull = func(n - 1 ) + func(n - 2 ) * 2
}
return result;
}
[解决办法]错了,想多了,n-2后一级一级上和n-1的重了。还是裴波那契数列.
[解决办法]如果最后n = 2 了可以走一次 也可以走两次啊 每次可以一级或者两级啊
[解决办法]有n级台阶,每次可以走1级或者2级,求有多少种走法
解:
//大的惊人,10阶梯都有4037880种走法,
int sum=0;//一共有多少次走法,默认全部都走一步,将这一次作为初始值
int n=10;//n是自己定义大小的一个数
for(int i=0;i<=n;i++){//因为包含一步都不走,所以循环次数会多一次
if(n%2==0){//如果总数是偶数,那么走一步的数量也必然是偶数才可能,奇数无效,直接continue;
if(i%2!=0){
continue;
}
}else{//如果总数是奇数,那么走一步的数量也必然是奇数才可能,偶数无效,直接continue;
if(i%2==0){
continue;
}
}
//得到当前走一步的数量
int oneSum=i;
//计算出当前走两步的数量
int towSum=(n-i)/2;
//那么接下来只要算出走一步的数量和走2步的数量有多少种排列方式,就算出了走i次一步可能有多少种走法了,加上这是个循环,最后的结果就正确了
//现在计算的好比是12345,和6789这些数任意组合,有多少种组合方式,最终也就成了123456789任意排列了,学过排列组合都知道,该不断相乘
//得到总的步数
int sumAll=oneSum+towSum;
int tamp=0;//记录前一个乘积结果
//遍历总步数,不断乘积
for(int s=1;s<=sumAll;s++){
if(s==1){//这一步判断而不直接给tamp赋值1,是不希望,没有循环次数的时候,却出现1的结果
tamp=1;
}else{
tamp=s*tamp;
}
}
//将结果加入结果中
sum+=tamp;
}
System.out.println(sum);