青蛙跳台阶问题。
Posted brokensword2004
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了青蛙跳台阶问题。相关的知识,希望对你有一定的参考价值。
题目描述:有n级台阶,一直青蛙,每次跳1个台阶或者每次跳2个台阶,请问青蛙上到第n级台阶有多少种方法。
不妨先用数学的方法找规律解这个问题:
假设他有3级台阶;
可分为两类:
跳0次2台阶,剩余3次1台阶;组合数C(0,3)
跳1次2台阶,剩余1次1台阶;组合数C(1,2)
总数sum=C(0,3)+C(1,2)
假设他有4级台阶;
跳0次2台阶,剩余4次1台阶;组合数C(0,4)//
跳1次2台阶,剩余2次1台阶;组合数C(1,3)//
跳2次2台阶,剩余0次1台阶;组合数C(2,2)//两个数字总是以1为单位加减靠近,且二者之和为台阶数,以第一个数字<=第二个数字结束
sum=C(0,4)+C(1,3)+C(2,2)
...........
假设他有10级台阶;
跳0次2台阶,剩余4次1台阶;组合数C(0,4)
跳0次2台阶,剩余4次1台阶;组合数C(0,4)
跳0次2台阶,剩余4次1台阶;组合数C(0,4)
跳0次2台阶,剩余4次1台阶;组合数C(0,4)
............
我们可以预测
sum=C(0,10)+C(1,9)+C(2,8)+C(3,7)+C(4,6)+C(5,5)
于是可以推测出第n级sum
sum=C(0,n)+C(1,n-1)+C(2,n-2)+...........
数学上组合数的计算方式为
C(a,b)=a!/b!*(a-b)!
所以在解答这个问题是,我们不避免要写一个运算阶乘的函数。
int fac(int n)
int ret=1;
if(n<=1)
return 1;
else
ret=ret*n;
return ret*fac(n-1);
再回到运算总数
sum=C(0,n)+C(1,n-1)+C(2,n-2)+...........
这是一个累加,故可以用上循环
等等,当n=1时,方法只有一种。故我们先可以把最简单的先解决。
if(n<=1)
return 1;
当n>=2时,我们会发现无法用计算机输出0!,故直接将其定为1
这里可以使用一个while循环来计算和,用b来接受和
int a=1,b=1;
while(a<=n)
b=b+fac(n-1)/(fac(a)*fac(n-1-a));//核心步骤
n--;
a++;
return b;
返回值就为b。
总的代码就为
//青蛙跳台阶
#include<stdio.h>
//阶乘函数
int fac(int n)
int ret=1;
if(n<=1)
return 1;
else
ret=ret*n;
return ret*fac(n-1);
//
int mains(int n)
int a=1,b=1;
if(n==1)
return 1;
while(a<=n)
b=b+fac(n-1)/(fac(a)*fac(n-1-a));//核心步骤
n--;
a++;
return b;
int main()
int n;int res;
scanf("%d",&n);
res=mains(n);
printf("%d",res);
return 0;
以上是关于青蛙跳台阶问题。的主要内容,如果未能解决你的问题,请参考以下文章