题目要求
一只青蛙一次可以跳上一节台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶共有多少种跳法?
题目分析
看到该题目,首先你可以在纸上画一画,想一想,从一级台阶往后推导,反正我是这么做的,当推导上三四级以后,你就会发现一个规律。按照这种方法推导出来的台阶数与可以选择的方法数之间的关系恰好就是斐波那契数列。那么就不难写出代码了,关键就是我们常常用递归的方式来实现一个斐波那契数列,递归的时间和空间复杂度可能会很高,如果使用的不恰当的话,就会造成严重的问题:调用栈溢出。所以可不可以有一种方法能够在O(n)的时间复杂度里完成这个任务呐?答案是肯定的(我似乎体会到了编程的乐趣)。先来画画这个题目的大概思路吧。
很简单的图就能分析清整个问题的关键。
这样一看,问题就转换成了求斐波那契数列。接下来就是怎样去掉重复计算的问题了,最先想到的方法就是我们能将以前计算出来结果的那些记录把它们存起来,等下一次再要计算时直接拿出来用就好了。直接上代码,简单的例子:
int JumpCore(int n,int a,int b)
{
if (n < 2)
return a;
else
return JumpCore(--n,a+b,a);
}
int Jump(int n)
{
if(n < 0)
return -1;
int a = 1;
int b = 1;
return JumpCore(n,a,b);
}
题目拓展
如果把条件改成一只青蛙一次可以跳1级,可以跳2级,.......也可以跳n级,那么有多少种跳法?
按照解决上述问题的思路,我们还是拿起小本本,自己多画几个例子,观察观察就能得出一个数学规律:f(n) = 2 ^(n-1)
总结
又到了总结的时候了,我太喜欢这个环节了,它意味着你把这个问题解决了,还从中收获了不少东西。所以下面就是我所收获的:遇到此类问题不要慌,在本子上画一画,数学问题一般都是有一个数学规律存在的,找出这个所谓的数学规律,接下来的事情就是用你擅长的语言把它描述出来。
博主又开始啰嗦了,写给自己的,虽然每一个问题很简单,但是正是这些小小的问题让我对编程爱的深沉,我们只是用另外一种我们喜欢的语言在讲故事而已。