斐波那契额数列的代码实现以及分析

本文对比了递归与循环两种方法实现斐波那契数列的效率,并通过实验数据展示了循环方法在处理大规模数值时的优势。

什么是斐波那契数列?斐波那契数列就是:1,1,2,3,5,8,13,21,34…这样的数列。通过分析可以发现斐波那契数列的规律,当n = 1时,f(n) = 1;当n = 2时,f(n) = 1;当n > 2时,f(n) = f(n-1) + f(n-2);有了这个规律我们就很容易的写代码,但是通常大多数人会直接使用递归的方法来实现斐波那契数列,这种方法很容易想到,但是有优点就会有缺点,我们分析如下:

斐波那契数列问题,有两种的解决办法:
 第一种:利用递归的算法,虽然简单,代码数量少,但是随着数的增大,效率降低,还可能出现内存栈的溢出;
 第二种:利用循环的方法,虽然比较复杂,代码数量相对教多,但是效率好,花费的时间短,如下面的耗时计算可以看出。

我们分别采用递归和循环的方法来实现斐波那契数列,通过以下的代码可以清楚的看出两者的优缺点,代码如下:

import java.util.Scanner;
class Solution1{
	/*本类是通过递归调用的方法求解斐波那契数列*/
	public long Function1(int n){
		if(n < 0){
			return 0;
		}
		if(n == 0){
			return 1;
		}
		if(n ==1){
			return 1;
		}
		else if(n > 1){
			return Function1(n-1) + Function1(n-2);//使用递归的方法
		}
		return 0;
	}
}
class Solution2{
	/*本类是通过使用循环的方法来求解斐波那契数列的问题*/
	public long Function2(int n){
		if(n < 0){
			return 0;
		}
		int[] result2 = {0,1};
		if(n < 2){
			return result2[n];
		}
		long num1 = 0;
		long num2 = 1;
		long sum = 0;
		for(int i = 2;i <= n;i++){ // 使用循环的方法
			sum = num1 + num2;
			num1 = num2;
			num2 = sum;
		}
		return sum;
	}
}
public class Fibonacci{
	public static void main(String[] args){
		System.out.println("请输入一个正整数:");
		Scanner sc = new Scanner(System.in);
		int a = sc.readInt(); 
		Solution1 s1 = new Solution1();
		long start1 = System.currentTimeMillis();
		long result1 = s1.Function1(a);
		long end1 = System.currentTimeMillis();
		System.out.println("递归调用的耗时是:" + (end1 - start1));
		System.out.println("最终的结果是:" + result1);
		System.out.println("---------------------");
		Solution2 s2 = new Solution2();
		long start2 = System.currentTimeMillis();
		long result2 = s2.Function2(a);
		long end2 = System.currentTimeMillis();
		System.out.println("循环方法的耗时:" + (end2 - start2));
		System.out.println("最终的结果是:" + result2);

	}
}

最终的结果如图所示:
**1、**当求斐波那契数列第20个数的时候,两者的对比如下:
在这里插入图片描述
可以看出,递归调用耗时为:1,循环的耗时为:0;此时两者还不是很明显。
**2、**当求斐波那契数列第30个数的时候,两者的对比如下:
在这里插入图片描述
可以看出,递归调用耗时为:7,循环的耗时为:0;此时两者已经逐渐有差距了。
3、 当求斐波那契数列第40个数的时候,两者的对比如下:
在这里插入图片描述
可以看出,递归调用耗时为:521,循环的耗时为:0;此时两者已经有了很大的差距了。
结论
综上所述,求斐波那契数列用循环要比用递归效率要高的多。

### 回答1: 使用Java代码实现斐波那契数列的方法是:public class Fibonacci { public static void main(String[] args) { int n1 = 0, n2 = 1, n3, i, count = 10; System.out.print(n1 + " " + n2); // printing 0 and 1 for (i = 2; i < count; ++i) // loop starts from 2 { n3 = n1 + n2; System.out.print(" " + n3); n1 = n2; n2 = n3; } } } ### 回答2: 斐波那契数列是指每个数都是前两个数的和,即F(n) = F(n-1) + F(n-2),其中F(1) = 1,F(2) = 1。 为了使用Java代码实现斐波那契数列,我们可以使用循环来计算每个数并将其存储在数组中。以下是一个简单示例: ```java public class Fibonacci { public static void main(String[] args) { int n = 10; // 输入要计算的斐波那契数列的长度 int[] fibonacci = new int[n]; fibonacci[0] = 1; // 第1个数是1 fibonacci[1] = 1; // 第2个数是1 for (int i = 2; i < n; i++) { fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2]; // 计算每个数的值 } // 输出斐波那契数列 for (int i = 0; i < n; i++) { System.out.print(fibonacci[i] + " "); } } } ``` 在这个示例中,我们首先定义了要计算的斐波那契数列的长度n,并创建了一个长度为n的整数数组来存储计算的结果。 接下来,我们将数组的第一个和第二个元素设置为1,这是斐波那契数列的起始条件。 然后,我们使用一个循环从第三个元素开始计算每个数的值,并将其存储在数组中。 最后,我们遍历数组并将每个数输出。 通过以上Java代码,我们可以得到斐波那契数列的前n个数并将其输出。在这个示例中,输出结果为1 1 2 3 5 8 13 21 34 55,表示斐波那契数列的前10个数。 ### 回答3: 斐波那契数列是指每个数都是前两个数之和的数列,从0和1开始,依次为0,1,1,2,3,5,8,13……以此类推。要使用Java代码实现斐波那契数列,可以使用循环或递归的方式。 方法一:循环实现 ```java public class Fibonacci { public static void main(String[] args) { int n = 10; // 指定数列长度 int[] nums = new int[n]; nums[0] = 0; // 数列的第一个数是0 nums[1] = 1; // 数列的第二个数是1 for (int i = 2; i < n; i++) { nums[i] = nums[i - 1] + nums[i - 2]; // 当前数等于前两个数之和 } for (int num : nums) { System.out.print(num + " "); // 输出数列中的每个数 } } } ``` 方法二:递归实现 ```java public class Fibonacci { public static void main(String[] args) { int n = 10; // 指定数列长度 for (int i = 0; i < n; i++) { System.out.print(fibonacci(i) + " "); // 输出数列中的每个数 } } public static int fibonacci(int n) { if (n == 0) { return 0; // 数列的第一个数是0 } if (n == 1) { return 1; // 数列的第二个数是1 } return fibonacci(n - 1) + fibonacci(n - 2); // 当前数等于前两个数之和 } } ``` 以上是两种常用的实现斐波那契数列的方式。循环实现的效率更高,而递归实现代码更简洁。根据实际需要选择合适的方式即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值