常规递归和尾递归的性能比较
来源:互联网 发布:药品数据 编辑:程序博客网 时间:2024/05/21 08:46
package net.liuyx.algorithm;public class Fibonacci { private static int[][] a = { { 1, 1 }, { 1, 0 } }; /** * @param args */ public static void main(String[] args) { for (Tester test : tests) test.test(80); } private static Tester[] tests = {/* new Tester("常规递归") { @Override long fib(int n) { if (n < 2) return n; return fib(n - 1) + fib(n - 2); } }, */new Tester("尾递归") { @Override long fib(int n) { return fib2(n, 1, 1); } private long fib2(int n, int acc1, int acc2) { if (n < 2) return acc1; return fib2(n - 1, acc2, acc1 + acc2); } }, new Tester("尾递归转换成循环性") { @Override long fib(int n) { int acc1 = 0, acc2 = 1; while (true) { if (n == 0) { return acc1; } if (n == 1) return acc2; int tmp = acc1; acc1 = acc2; acc2 = acc2 + tmp; n--; } } }, new Tester("经过算法优化的 ") { @Override long fib(int n) { int[][] arr = fibonacciAlogrithm(n); long result = arr[1][1]; return result; } private int[][] fibonacciAlogrithm(int n) { int[][] result = { { 1, 1 }, { 1, 0 } }; while (n != 0) { if ((n & 1) != 0) { result = multiply(result, a); } a = multiply(a, a); n = n >> 1; } return result; } private int[][] multiply(int[][] a, int[][] b) { int[][] result = new int[2][2]; result[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0]; result[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1]; result[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0]; result[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1]; return result; } } }; private static abstract class Tester { private String name; public Tester(String name) { this.name = name; } public void test(int n) { System.out.print(name + ": "); long start = System.nanoTime(); fib(n); long duration = System.nanoTime() - start; System.out.println("历时: " + duration); } abstract long fib(int n); }}
结果:
- 常规递归和尾递归的性能比较
- 递归和尾递归的比较,斐波那契
- strlen()函数的常规写法和递归写法
- 逆序的两种算法 递归和常规
- Ruby插入排序的常规写法和递归写法
- 系统递归和自己用栈实现递归的比较
- strlen库函数 常规实现 和 递归实现。
- 递归和尾递归
- 尾递归和递归
- 递归和尾递归
- 递归和尾递归
- 递归和尾递归
- 递归和尾递归
- 递归和尾递归
- 尾递归和递归
- 递归和尾递归
- 在Java中谈尾递归--尾递归和垃圾回收的比较
- 循环和递归的优缺点比较
- UVa 167 - The Sultan's Successors
- IOS单例模式及单例模式的优缺点
- getopt实例
- js学习
- ActiveSync失败和RTC的关系
- 常规递归和尾递归的性能比较
- 使用OpenCV实现内存中图像数据的RGB-->HSV转换
- XPath 对xml文件操作
- 启动loadrunner的agent时,发现日志中报端口已被占用,启动失败解决办法
- Pattern Pathology
- Beginning Python - Chapter6 : More Abstraction
- iterator/generator 应用举例 Mymap / Myzip
- Python中 内置函数
- sqllite 你懂得 生成db文件