文章目录
- 斐波那契数列
- 描述
- 输入描述:
- 返回值描述:
- 示例1
- 示例2
- 示例3
- 思路
- 非递归
- 递归
- 完整代码
斐波那契数列
描述
大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。
斐波那契数列是一个满足
f
i
b
(
x
)
=
{
1
,
x
=
1
,
2
f
i
b
(
x
−
1
)
+
f
i
b
(
x
−
2
)
,
x
>
2
fib(x)=\begin{cases} 1, \quad\quad\quad\quad\quad\quad\quad\quad\quad x=1,2\\ fib(x-1)+fib(x-2),x>2\end{cases}
fib(x)={1,x=1,2fib(x−1)+fib(x−2),x>2
的数列
数据范围: 1 ≤ n ≤ 40 1≤n≤40 1≤n≤40
要求:空间复杂度 O ( 1 ) O(1) O(1),时间复杂度 O ( n ) O(n) O(n) ,本题也有时间复杂度$O(logn) $的解法
输入描述:
一个正整数n
返回值描述:
输出一个正整数。
示例1
输入:
4
返回值:
3
说明:
根据斐波那契数列的定义可知,fib(1)=1,fib(2)=1,fib(3)=fib(3-1)+fib(3-2)=2,fib(4)=fib(4-1)+fib(4-2)=3,所以答案为3。
示例2
输入:
1
返回值:
1
示例3
输入:
2
返回值:
1
思路
求斐波那契数列是一个很经典的题目了,在上《算法设计与分析》这门课就有这个问题,当时老师教了递归和非递归两种解法
非递归
很明显,题目给出了斐波那契数列的递推方程,即当x>2时, f i b ( x ) = f i x ( x − 1 ) + f ( x − 2 ) fib(x)=fix(x-1)+f(x-2) fib(x)=fix(x−1)+f(x−2),用java写出来就是
public int Fibonacci (int n) {
// write code here
if (n <= 2) {
return 1;
}
int[] fib = new int[n + 1];
fib[1] = 1;
fib[2] = 1;
for (int i = 3; i <= n; i++) {
fib[i] = fib[i - 1] + fib[i - 2];
}
return fib[n];
}
如果输入小于2则直接输出1,如果大于2则根据递推方程来求解斐波那契数列每个位置的值为多少,最后返回最后一个值即可
递归
其实递归和非递归的思路很像,首先要清楚对于使用递归来求解的问题,要实现一个递归函数首先要找到它的边界条件和递归方程
- 递归方程:由其规律可以很容易得到递归方程为 F(n)=F(n-1)+F(n-2),其中n>1
- **边界条件:**由于递归方程的范围为n>2,而n的取值为大于等于0的正整数,故边界条件为当n=1和当n=2时,由最开始的定义可得此时结果都为1
递归树如下
代码如下:
if (n <= 2) {
return 1;
}
else{
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
完整代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return int整型
*/
public int Fibonacci (int n) {
// write code here
//递归
// if (n <= 2) {
// return 1;
// } else {
// return Fibonacci(n - 1) + Fibonacci(n - 2);
// }
//非递归
if (n <= 2) {
return 1;
}
int[] fib = new int[n + 1];
fib[1] = 1;
fib[2] = 1;
for (int i = 3; i <= n; i++) {
fib[i] = fib[i - 1] + fib[i - 2];
}
return fib[n];
}
}