标签:arr java 递归 int 题解 two 阿契 num return
文章目录
题目
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
n≤39
题解
1. 递归法
斐波那契数列的标准公式为:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
根据公式可以直接写出:
/**
* 方法一:只用递归处理
*
* @param n
* @return
*/
public static int Fibonacci(int n) {
if (n == 0 || n == 1) return n;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
2. 优化递归
递归会重复计算大量相同数据,我们用个数组把结果存起来
/**
* 方法二:由题意可以知道n<=39创建数组每次计算存下来即可
*
* @param n
* @return
*/
public static int Fibonacci2(int n) {
if(n == 0)return 0;
if(n == 1)return 1;
int[] arr = new int[40];
arr[0] = 0;
arr[1] = 1;
for (int i = 2; i <= n; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[n];
}
运行时间减少了,但是内存依旧占用很大
3. 优化存储
可以发现每次就用到了最近的两个数,所以我们可以只存储最近的两个数
- num 存储第 n 项的值
- one 存储第 n-1 项的值
- two 存储第 n-2 项的值
/**
* 第二种方法占空间,继续优化
*
* @return
*/
public static int Fibonacci3(int n) {
if(n == 0)return 0;
if(n == 1)return 1;
int num = 0;//记录结果
int one = 0;//第一个数
int two = 1;//第二个数
while ((n - 1) > 0) {
num = one + two;
one = two;
two = num;
n--;
}
return num;
}
4. 继续改造
我们已知前两项的值,然后我们就可以用前两项的值求出第3项的值,接着求第4、第5、……,直到求出第n项的值。
public int Fibonacci4(int n) {
if(n == 0)return 0;
if(n == 1)return 1;
int num = 1;//记录结果,也记录上一个数
int one = 0;//第一个数
while ((n - 1) > 0) {
num = one + num;
one = num - one;
n--;
}
return num;
}
标签:arr,java,递归,int,题解,two,阿契,num,return 来源: https://blog.csdn.net/qq_44895397/article/details/112927202
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。