递归2之对青蛙跳台阶和斐波那契数列的思考
Posted zsQgqdsd1002
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归2之对青蛙跳台阶和斐波那契数列的思考相关的知识,希望对你有一定的参考价值。
前言
昨天我算是初步了解了递归并且做了一定的练习,今天就来看一看递归的而两个经典案例:青蛙跳台阶和斐波那契数列的实现。
一、青蛙跳台阶和斐波那契数列是什么?
青蛙跳台阶和斐波那契数列算是递归的两个经典案例了。
青蛙跳台阶就是说有一个青蛙,他面前有n级台阶,青蛙每次可以跳一级或者两级台阶,这个呢是根据青蛙的心情来看的,问青蛙跳这n级台阶有多少种跳法?
斐波那契数列,又称黄金分割数列,指的是这样一个数列:、1、1、2、3、5、8、13、21、34、……
下面就来对他们用C语言逐个实现。
二、两者的逐个实现
1.青蛙跳台阶
猛地一看这个问题感觉好像很难解决,但是仔细一想其实也没那么难,这种时候使用逆推法有很好的效果。假设这个青蛙现在就处于第5级台阶,那青蛙跳到第5级台阶的前一步一定是跳到第4级或者第3级台阶上,第4级台阶和第3级台阶的前一步也是一定是这个规律,直到推导到青蛙处于第2级或者第1级台阶的时候停止。因为青蛙跳到第1级台阶一定只需要一步,而青蛙跳到第2级台阶则是最多需要两步。
分析完问题我们显然已经得到了递推公式:
Jump(n)=Jump(n-1)+Jump(n-2);
那限制条件根据前面的分析,也很容易的得到了,就是n==1或者n==2的时候,结束递归,因为这两个阶段n的值是已知的也是固定的。根据这两点我们可以开始编写程序了,代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
long long Jump(int n) {
if ( n == 1){
return 1;
}
else if (n == 2) {
return 2;
}
else {
return Jump(n - 1) + Jump(n - 2);
}
}
int main() {
int a;
scanf("%d", &a);
long long b = Jump(a);
printf("%lld", b);
return 0;
}
在这里需要注意的是,用我用b来接收了Jump的返回值,而且我的Jump()函数和b的类型都是long long类型,而表示台阶数的n还有a都是int类型。这个其实是看个人了,因为随着台阶数目的增加,跳跃方式的增加是以很迅猛的速度增长的,可能已经超出了int类型所能表达的数字范围。给台阶数的类型为int是因为台阶数用int来表示已经够了,毕竟我们不能把青蛙累死,你们觉得呢?
2.斐波那契数列
我们仔细观察斐波那契数列发现,其从第三项开始,每一项都等于前两项的和。好嘛,递推公式直接就有了
Fib(n) = Fib(n - 1)+Fib(n - 2);
有点熟悉的感觉是不是,其实和上面的青蛙跳台阶是一样的递推公式,那么斐波那契数列的限制条件就应该是当(n == 1 || n == 2)时,结束递归。下面开始编写代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
long long Fib(int n) {
if (n == 1 || n == 2) {
return 1;
}
else {
return Fib(n - 1) + Fib(n - 2);
}
}
int main() {
int a;
scanf("%d", &a);
long long b = Fib(a);
printf("%lld", b);
return 0;
}
和上面一样同样是使用了long long类型的结果和int类型的变量,代码也是非常的通俗易懂,就不多赘述了。
总结
其实青蛙跳台阶和斐波那契数列在本质上是没什么区别的,都是从第三项开始,每一项等于前两项之和,唯一的区别也就是初值不同,青蛙跳台阶在n == 1时为1,在n == 2时为2,而斐波那契数列则是(n == 1 || n == 2)时都为1。所以我觉得青蛙跳台阶其实就是斐波那契数列的童话版,其实重要的不是如何写代码,重要的是如何找到遇到这一类问题时,如何寻找递归的规律,如何去找到这个限制条件,培养的更是一种思想。
以上就是我这次的思想与感悟,如果有什么可以优化或者改正的地方,欢迎大佬联系我。
以上是关于递归2之对青蛙跳台阶和斐波那契数列的思考的主要内容,如果未能解决你的问题,请参考以下文章