1.问题
题目:从前有一只青蛙他想跳台阶,有n级台阶,青蛙一次可以跳1级台阶,也可以跳2级台阶;
问:该青蛙跳到第n级台阶一共有多少种跳法。
2.代码
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);//先设置变量,n级台阶
printf("%d", JumpStep(n));
return 0;
}
int JumpStep(unsigned int n)
{
//转换成数学问题,拆分一共跳了多少次1阶与多少次2阶
int i = 0;//跳了i次1阶
int j = 0;//跳了j次2阶
//要满足n=i+2j
int count = 0;//计数
for (i = 0; i <= n; i++)
{
for (j = 0; j <= n / 2; j++)
{
if (i + 2 * j == n)//找出所有情况下i与j的值
{
Kind(i, j);
count += Kind(i, j);
}
}
}
return count;
}
int Kind(int i, int j)
{
return N(i+j) / (N(i) * N(j));//排列组合,数学思想简单求解
}
int N(int n)//求n的阶乘,注意在这里n是会等于0的
{
if (n >= 1)
return n * N(n - 1);
else if(n = 0)
return 1;
}
3.总结
所用方法较为繁琐,代码较长,只是解决此类问题思路之一。
如果想要解决一个问题,先着手去写,想到一种思路先去表达出来,再慢慢优化、添加、改正,比如我代码中后面的注释就体现了我一步步思考的过程。
4.另一种优秀的思路(补充)
#include<stdio.h>
int Frog(unsigned int n)
{
if (n == 1)
return 1;
else if (n == 2)
return 2;
else
return Frog(n - 1) + Frog(n - 2);//循环进行跳1阶(剩n-1阶)与跳2阶(剩n-2阶)两种
//剩的n-1(或者n-2)阶再进行跳1阶与跳2阶两种情况
//如此跳下去直到剩下1阶或者2阶
//剩下1阶只有1种跳法(跳1次1阶)
//剩下2阶只有2种跳法(跳2次1阶与跳1次2阶)
}
//以上方法属于跳一下计一下,步步走战略,较为简洁
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d", Frog(n));
return 0;
}