青蛙跳台阶是个什么问题呢?
一只青蛙一次最少可以跳一层台阶,最多可以一次跳两次台阶,该青蛙跳上n层台阶有多少种跳法?
分析问题
由上图可见
1层台阶有一种跳法
2层台阶有2种跳法
3层台阶有3种跳法
4层台阶有5种跳法
......n层n种跳法
我们列个数列可以更直观的看出来
1 2 3 5 8 13 21 34 55 89
这个数列如果学过斐波那契数列的肯定会觉得和熟悉,这个青蛙跳台阶其实中心问题就是包含了斐波那契数列的思想
斐波那契数列:1 1 2 3 5 8 13 21 34 55 89
找规律:
其实学过斐波那契数列的都知道有一个公式就是
n<=2 Fib(1)
n>3 Fib(n-1)+Fib(n-2)
青蛙跳台阶的规律
Fib(1) = 1 , Fib(2) = 2
当n>=3时,Fib(n)=Fib(n-1)+Fib(n-2)
对比一下上面两个公式可以看出两个公式其实差别不大
下面我用C语言用递归的方法的代码放在下面可以参考一下
int Fib(int n)
{
if (n == 1 || n == 2)
{
return n;
}
else
{
return Fib(n - 1) + Fib(n - 2);
}
}
int main()
{
int n = 10;
int i = 0;
for (i = 1; i <=n ; i++)
{
printf("%d\n", Fib(i));
}
return 0;
}
上面这个用递归写的代码时可以运行的,但是变量n如果比较大的情况下呢可能会造成栈溢出,而且计算机在进行大量的重复计算,上面这个代码的效率会很低。
下面我用迭代的方法写一下
int Fib(int n)
{
int a = 1;
int b = 2;
int c = 0;
int i = 0;
for (i = 1; i <=n; i++)
{
if (i == 1 || i == 2)
{
printf("%d\n", i);
}
else
{
c = a + b;
a = b;
b = c;
printf("%d\n", c);
}
}
}
int main()
{
int n = 10;
Fib(n);
return 0;
}
上面的迭代方法呢主要精思想就是“大事化小”。
下面我用图来解释一下:
上图就是迭代方法的分析
在使用递归方法的时候如果造成栈溢出或者效率很低的时候就可以使用非递归的方法来写这个代码(比如上面的递归的方法)
以上是我自学c语言的递归和迭代之后对青蛙跳台阶的这个问题的看法 ,上面大部分的内容是我做笔记的。有哪里不对还请联系我改正。
感谢观看!!!