这题是用C写的~
在牛客上半天找不着ACM模式,练习模式里只有核心代码模式
这样用C语言编译器就不能自定义函数啊,不鸡肋吗???
解决方法:在核心代码模式下用C++编译器(反正C++完全兼容C的不是吗~~)
但是这样并不好,很气!
题目描述
描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
示例1
输入:
2
返回值:
2
示例2
输入:
7
返回值:
21
解题思路
- 简单递归,别说青蛙跳台阶了,兔子下楼也是一样的
- 理解递归的思想很重要,至于什么是递归这里不多赘述(自行百度)
- 常见的递归:斐波那契数列(1,1,2,3,5,8,13…)
- 本题也是斐波那契哦~
- 在递归时,往往需要自己调用自己,判断好停止时机很重要
- 理解什么时候
sum++
:撞墙(搜索到头了)表示你已经走出了一条路,此时sum++
- sum表示路径数量
- 如果还不会,建议画图,本题是一个标准的二叉树,还是满二叉树,数叶子结点的个数
- 一般递归都是数叶子结点的个数,如果不好理解自己调用自己,可以去理解一下二叉树
- 当然我给出的题解是用递归做的,但是你如果观察除了斐波那契,那肯定是直接斐波那契时间复杂度低啊! 用一个数组存一串斐波那契,返回第n项
a[n]
就很完美了,保证AC - 公式:求第n个斐波那契数
- 如果你想快速得到一个存有斐波那契数列的数组,用一个
for
循环不就可以搞定了么?时间复杂度O(n)
,真香啊!
题解
我的代码(完整版)
#include<stdio.h>
#include<math.h>
int sum = 0;
void jump(int step, int number)
{
if (step >= number)
{
sum++;
return;
}
else
{
jump(step + 1, number);
if (step + 2 <= number)
jump(step + 2, number);
}
return;
}
int jumpFloor(int number )
{
sum = 0;
jump(0, number);
return sum;
}
int main()
{
// for test
printf("%d", jumpFloor(7));
return 0;
}
在牛客上提交时的代码(真的无力吐槽了)