递推算法在求斐波那契数列的优势
斐波那契数列是我们学习递归算法的常用实例,但实际上递归算法解决这类问题并没有优势,接下来我用递推算法来解决斐波那契数列,大家看一下它的优势之处。
递推算法
import java.util.Scanner; /** * Fibonacci数列:1,1,2,3,5,8,13,21… * 求该数列第n个数的值。 * 数列满足公式:F1=1,F2=1,Fn=Fn-1 + Fn-2 */ public class Fibonacci { public static void main(String[] args) { System.out.print("请输入你想知道数列第几项的值:"); Scanner input = new Scanner(System.in); int n = input.nextInt(); //递推算法查看Fibonacci数列第n项的值 System.out.println("数列的第" + n + "项的值为:" + recursive(n)); } /* 递推算法查看Fibonacci数列第n项的值 */ private static int recursive(int n) { int r1 = 1, r2 = 1; int r = 0; if (n == 1 || n == 2) { return 1; } for (int i = 3; i <= n; i++) { r = r1 + r2; r1 = r2; r2 = r; } return r; } }
递归算法
import java.util.Scanner; public class Fibonacci { public static void main(String[] args) { System.out.print("请输入你想知道数列第几项的值:"); Scanner input = new Scanner(System.in); int n = input.nextInt(); //递归算法查看Fibonacci数列第n项的值 System.out.println("数列的第" + n + "项的值为:" + recursiveDESC(n)); } /* 递归算法查看Fibonacci数列第n项的值 */ private static int recursiveDESC(int n) { if (n == 1 || n == 2) { return 1; } else { return recursiveDESC(n - 1) + recursiveDESC(n - 2); } } }
对比实验
查看相同项所用时间对比
测试代码
public static void main(String[] args) { System.out.print("请输入你想知道数列第几项的值:"); Scanner input = new Scanner(System.in); int n = input.nextInt(); long t1=System.currentTimeMillis(); //递推算法查看Fibonacci数列第n项的值 recursive(n); long t2=System.currentTimeMillis(); //递归算法查看Fibonacci数列第n项的值 recursiveDESC(n); long t3=System.currentTimeMillis(); System.out.println("递推算法用时:"+(t2-t1)+"毫秒"); System.out.println("递归算法用时:"+(t3-t2)+"毫秒"); }
实验结果
测试一些数据,选择了较为可靠的数据展示,结果很明显,0和1的差距
请输入你想知道数列第几项的值:40 递推算法用时:0毫秒 递归算法用时:300毫秒
总结
本来想这对比查看最大项实验的,结果递归算法一直在运行,一直递归调用方法,方法栈也不炸.思考了一下,其实递归调用主要受限于内存容量,这个实验也没啥意义.就只做了时间测试实验,大家感兴趣的可以体验一下这两个算法~
递归算法,每次都是对方法的操作,而且大量方法进栈,对栈内存的压力很大
递推算法,每次是对数进行操作,只保存了后两项的数值,无论是对内存还是CPU都没啥压力

浙公网安备 33010602011771号