文章目录
- [一 、基础的三种解法(数组、交换、递归)](#一 、基础的三种解法(数组、交换、递归))
- 二、拓展衍生(动态规划、矩阵)-后续完善......
-
- [2.1 动态规划(dp)](#2.1 动态规划(dp))
- [2.2 矩阵](#2.2 矩阵)
- 三、拓展(后续完善......)
-
- [3.1 兔子繁殖](#3.1 兔子繁殖)
- [3.2 爬楼梯](#3.2 爬楼梯)
背景: 牛客网刷题看到算法-noob36 牛牛学数列5 ,这里提到了斐波那契数列。这个数列挺知名的,也很有趣。搜了下也看到了别人写过的相关博客。这里主要先记录三种基础解法,后期刷到专门考察DP(Dynamic Programing)、矩阵的时候,再回头更新此博客来补充相关解法。
一 、基础的三种解法(数组、交换、递归)
代码见gitee:
gitee提交记录,这个项目是记录牛客网探索过程

java
/**
* 计算斐波那契数列
* 牛客网 - noob36 牛牛学数列5
* 斐波那契定义: F(0)=0,F(1)=1,F(2)=1, ...... F(n)=F(n-1)+F(n-2)(n≥2)
* 输入描述:在一行中输入一个整数 n,满足 1≦n≦46
* 数列前几项为:0 1,1,2,3,8
*
* @param n
* @retur 打印出第n项,也就是F(n),这里顺便打印出所有的计算结果,这样可以顺便观察计算规律
*/
static String calculateFibonacci(int n) {
//下面是我自己思考的第一种做法,定义个数组存储下所有计算结果,然后把计算的结果取出来即可
if (n <= 2) {
long[] fibonacciArray = new long[3];
fibonacciArray[0] = 0;
fibonacciArray[1] = 1;
fibonacciArray[2] = 1;
System.out.println(JSON.toJSONString(fibonacciArray));
return JSON.toJSONString(fibonacciArray);
} else {
long[] fibonacciArray = new long[n + 1];
fibonacciArray[0] = 0;
fibonacciArray[1] = 1;
fibonacciArray[2] = 1;
for (int i = 3; i < (n + 1); i++) {
fibonacciArray[i] = fibonacciArray[i - 1] + fibonacciArray[i - 2];
}
System.out.println(JSON.toJSONString(fibonacciArray));
return JSON.toJSONString(fibonacciArray);
}
}
/**
* 看了题解和讨论后,发现网友的做法没有使用中间变量存储,使用交换计算的。
* 这个想法很简洁,也值得照猫画虎下。
*
* @param n
* @return
*/
static String calculateFibonacciV2(int n) {
//学习网友解法,使用变量交换计算。
//这个集合只是存储最终结果,方便打印计算链数据而已。
List<Long> result = new ArrayList<>();
Long f1 = 1L;//上上一个值
Long f2 = 1L;//上一个值
result.add(f1);
result.add(f2);
if (n < 3) {
return JSON.toJSONString(result);
}
for (int i = 3; i <= n; i++) {
//核心代码------思路:动态交换
long fn = f2 + f1;
result.add(fn);
f1 = f2;
f2 = fn;
}
return JSON.toJSONString(result);
}
/**
* 看基础解法里还有递归写法,按照这个思路实现下
*
* @param n
* @return
*/
static String calculateFibonacciRecursion(int n) {
//学习网友解法,使用变量交换计算。
//这个集合只是存储最终结果,方便打印计算链数据而已。
List<Long> result = new ArrayList<>();
long fiboResult = fibonacciRecursion(n);
result.add(fiboResult);
return JSON.toJSONString(result);
}
java
//测试结果如下:
// calculateFibonacci(47);
//输入:6 输出:[0,1,1,2,3,5,8]
//输入47 输出:[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733,1134903170,1836311903,2971215073]
/*
String result = calculateFibonacciV2(47);
System.out.println("斐波那契数列计算结果(变量交换): " + result);
*/
// 输入:6 输出:斐波那契数列计算结果(变量交换): [1,1,2,3,5,8]
//输入47 输出:斐波那契数列计算结果(变量交换): [1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733,1134903170,1836311903,2971215073]
//斐波那契数列-递归解法测试
String result = calculateFibonacciRecursion(3);
System.out.println("斐波那契数列计算结果(递归): " + result);
//结果:斐波那契数列计算结果(递归): [8]
二、拓展衍生(动态规划、矩阵)-后续完善......
待后续补充......
2.1 动态规划(dp)
2.2 矩阵
三、拓展(后续完善......)
为提升刷题速度,这些衍生的内容后期的题目可能还会遇到,遇到了回头完善,不做过多的延伸。
3.1 兔子繁殖
后续补充......
3.2 爬楼梯
后续补充......