青蛙跳台阶问题。

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;





以上是关于青蛙跳台阶问题。的主要内容,如果未能解决你的问题,请参考以下文章

青蛙跳台阶的问题

青蛙跳台阶问题

青蛙跳台阶问题

青蛙跳台阶衍生之变态跳台阶(递归,思路分析及代码实现)

青蛙跳台阶

青蛙跳台阶问题