一、问题概述
假设有一只青蛙,每次可以跳一个台阶,也可以跳两个台阶,那么这只青蛙要跳上第n个台阶有多少种跳法。
二、模拟递推
我们研究这个问题前,可以先设想n为小一点的数的情况,再试着找出其中的规律。
当我们多列举几种情况时,我们是不是发现 1、2、3、5、8 这样的规律有点像斐波那契数列。我们知道斐波那契数列可以通过递归解决,所以我们也可以试着用递归解决青蛙跳台阶问题。
这里以青蛙跳到第三个台阶为例,推出递归关系式
三、函数表达
当我们得出规律后,我们就可以尝试写出函数表达式来把这个规律变成容易转换的数学语言。
通过分析我们可以得出上图中的函数表达式
四、c语言实现
得出函数表达式后,我们就可以将其转化为c语言去实现。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int frog(int n)// 等同于我们第三点中得到的函数表达式 f(n)
{
if (0 < n && n <= 2)
{
return n;// 当 0 <= n < 2 ,f(n) = n
}
if(n>2)
return frog(n - 2) + frog(n - 1);
// 当 n > 2 ,f(n) = f(n-2) + f(n-1)
}
int main()
{
int x = 0;
while (scanf("%d", &x) != EOF)
//可以多次输入,输入 ctrl + z 结束程序,VS编译器需要输入三次 ctrl + z 才可结束程序
{
int sum = frog(x); // 用sum存frog的返回值,即到第n个台阶的方法总数
printf("sum = %d\n", sum);
}
return 0;
}
五、函数递归展开
最后我们可以将上述函数的递归展开,观察其递归的过程。