`

Java之递归和迭代用法

    博客分类:
  • java
阅读更多

斐波那契数列的求和示例

package com.cxl.algorithm;

/**
 * 斐波那契数列
 *
 */
public class FibonacciSequenceTest {
	private static final int a1 = 1;//第一项默认值
	private static final int a2 = 2;//第二项默认值
	
	public static void main(String[] args) {
		//递归
		System.out.println("递归求和:" + FibonacciSequenceTest.getSumByFibonacciSequence(45));
		//迭代
		System.out.println("迭代求和:" + FibonacciSequenceTest.getSumByNonRecursive(45));
	}
	/**
	 * 斐波那契数列求和:迭代
	 * @return
	 */
	public static int getSumByNonRecursive(int n) {
		long startTime = System.currentTimeMillis();
		if(n == 1) {
			return a1;
		}
		int sum = a1 + a2;
		if(n == 2) {
			return sum;
		}
		int firstNum = a1;
		int secondNum = a2;
		int lastNum = 0;
		for(int i = 3; i <= n ;i++) {
			//迭代关系(an = an-2 + an-1; an-2=an-1; an-1=an;)
			lastNum = firstNum + secondNum;
			firstNum = secondNum;
			secondNum = lastNum;
			sum += lastNum;
		}
		System.out.println("迭代求和耗时:" + (System.currentTimeMillis() - startTime) + "ms");//0ms
		return sum;
	}
	
	/**
	 * 斐波那契数列前n项和(sn = a1 + a2+...+ an) 递归
	 * @return
	 */
	public static int getSumByFibonacciSequence(int n) {
		long startTime = System.currentTimeMillis();
		if(n == 1) {
			return a1;
		}
		int sum = 1;
		int lastNum = 0;
		for(int i = 2; i <= n; i++) {
			lastNum = FibonacciSequenceTest.getLastNum(i);
			sum += lastNum;
		}
		System.out.println("递归求和耗时:" + (System.currentTimeMillis() - startTime) + "ms");//14839ms
		return sum;
	}
	
	/**
	 * 递归:第n项的值(递推公式:an = a(n - 1) + a(n - 2))
	 * 1 2 3 5 8 13 21
	 * @param n
	 * @return
	 */
	public static int getLastNum(int n) {
		if(n == 1) {
			return a1;
		}
		if(n == 2) {
			return a2;
		}
		int lastListNum = getLastNum(n - 1) + getLastNum(n - 2);
		return lastListNum;
	}
}

数列求和:1 + 1/2! + 1/3! + 1/4! + 1/5! + ... + 1/50! 

package com.cxl.algorithm;

public class SquenceTest {

	/**
	 * 求和:1 + 1/2! + 1/3! + 1/4! + 1/5! + ... + 1/50!
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("递归求和:" + SquenceTest.getSquenceSum(50));
		System.out.println("迭代求和:" + getSequenceSumByInterator(50));
	}
	
	/**
	 * 递归求和
	 * @param n
	 * @return
	 */
	public static double getSquenceSum(int n) {
		long startTime = System.currentTimeMillis();
		if(n == 1) {
			return 1d;
		}
		double sum = 1d;
		double a = 1d;
		for(int i = 2; i <= n; i++) {
			long num = getSquenceValueByRecurvise(i);
			sum += a / num;
		}
		System.out.println("递归求和耗时:" + (System.currentTimeMillis() - startTime) + "ms");//0ms
		return sum;
	}
	
	/**
	 * 递归方式
	 * @param n
	 * @return
	 */
	public static long getSquenceValueByRecurvise(int n) {
		if(n == 1) {
			return 1;
		}
		long squenceValue = n * getSquenceValueByRecurvise(n-1);
		return squenceValue;
	}
	
	/**
	 * 迭代求和
	 */
	public static double getSequenceSumByInterator(int n) {
		long startTime = System.currentTimeMillis();
		if(n == 1) {
			return 1d;
		}
		double sum = 1d;
		double a = 1d;
		long beforeSeqValue = 1;
		long nextSeqValue = 0;
		for(int i = 2; i <= n; i++  ) {
			//迭代关系(an = n * a(n-1) an-1 = an;)
			nextSeqValue = i * beforeSeqValue;//相当于数学中的递推公式
			beforeSeqValue = nextSeqValue;
			sum += a / nextSeqValue;
		}
		/*while(n > 1) {
			nextSeqValue = n * beforeSeqValue;
			beforeSeqValue = nextSeqValue;
			n--;
		}*/
		System.out.println("迭代求和耗时:" + (System.currentTimeMillis() - startTime) + "ms");//0ms
		return sum;
	}
}

 总结:递归效率相对较低,优先使用迭代,无法使用迭代,则使用递归

分享到:
评论

相关推荐

    Java 递归和迭代的方法详解.pdf

    像这样的日志代码会更好: if (log.isLoggable(Level.FINE)) { ...关于这个主题有大量优秀的资源,相关的方法和工具也不只针对Java。假定你已经完成了分析,并且判断出是运行环境中Java 组件的性能需要改善。

    Java基础知识点总结.docx

    equals()方法和hashCode()方法 270 数据结构 273 Array方法类汇总 304 Java数组与集合小结 305 递归 309 对象的序列化 310 Java两种线程类:Thread和Runnable 315 Java锁小结 321 java.util.concurrent.locks包下...

    Java数据结构和算法中文第二版(1)

    它使用JAVA语言说明重要的概念,而避免了C/C++语言的复杂性,以便集中精力论述数据结构和算法。 经验丰富的作者Robert Lafore先生提供了许多简单明了的例子,避免了对于这类命题常见的冗长、繁琐的数学证明。在第二...

    AIC的Java课程1-6章

    第3版 机械工业出版社  教学内容和要求 知识点 重要程度 使用频度 难度 Java 入门 高 中 易 变量和运算符 高 高 中 控制结构 高 高 易 数组 高 高 中 方法 很高 高 中 封装 很高 很高 难...

    Java完美编程(第3版).pdf

    本书是为全英文版本。 《Java完美编程(第3版)》,英文名《Absolute Java (3rd Edition)》,英文版出版社:Addison ...第16章 稽核,映射和迭代器 第17章 初探swing  第18章 深入swing 第19章 java的发展永无止境

    java进阶13天资料.zip

    day09-方法引用, Stream流,File类 , 递归 ,字节流 day10-字符流, 缓冲流、转换流、序列化流,打印流,属性集 day11-Socket网络编程、NIO day12-JUnit单元测试、反射、注解、动态代理 day13-XML和Dom4j,装饰模式,...

    java程序员用刷算法题-JavaCoding:来自Coding(codility)访谈的Java程序

    我们准备交叉问题,例如使用迭代而不是递归以及如何使用缓存和记忆优化解决方案。 一个质数(解决方案) 编写一个 Java 程序来检查给定的数是否是质数。 请记住,质数是不能被任何其他数字整除的数字,例如 3、5、7...

    Java数据结构和算法中文第二版(2)

    它使用JAVA语言说明重要的概念,而避免了C/C++语言的复杂性,以便集中精力论述数据结构和算法。 经验丰富的作者Robert Lafore先生提供了许多简单明了的例子,避免了对于这类命题常见的冗长、繁琐的数学证明。在第二...

    java 面试题 总结

    派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即...

    java程序员刷题知乎-LogicalPrograms:逻辑程序

    我们准备交叉问题,例如使用迭代而不是递归以及如何使用缓存和记忆优化解决方案。 2. 质数(解决方案) 编写一个 Java 程序来检查给定的数是否为质数。 请记住,质数是不能被任何其他数字整除的数字,例如 3、5、7、...

    nqueens-local-search:Java中的局部搜索和模拟退火算法

    N皇后区用模拟退火求解随机板: $ javac NQueens.java$ java NQueens要使用本地搜索算法,请编辑NQueens的 main 方法。本地搜索第一次迭代使用局部搜索算法: 从随机排列的棋盘开始,每行一个皇后生成相邻状态,其中...

    data-structures:用Java实现的所有数据结构

    javac file_name.java跑步运行程序写下来:java file_name实施了什么:目录大批数据结构大批一维阵列在未排序的数组中搜索,插入和删除排序数组中的插入,搜索和删除操作遍历迭代方式递归方法二维阵列遍历更新中多维...

    算法:算法实践,例如分治法,贪婪算法,动态规划等

    算法 算法实践,例如分治法,贪婪算法,动态编程等 到目前为止,此回购包含以下方面的实践: 插入排序 合并排序 MaximumSubArray分而治之和蛮力方法 ... 最小和最大(迭代和递归) HashTable(在每个存储桶中使用L

    两种方法求得最大公约数

    编一程序,求两个正整数m、n的最大公约数。 要求程序中有两个方法,分别使用循环和递归, 最后在主方法中两次求解并输出最大公约数。

    java范例开发大全源代码

     实例70 求方阵对角线之和 96  实例71 矩阵的加法 97  实例72 矩阵的减法 98  实例73 快递报价单 99  5.3 数组的排序 101  实例74 冒泡排序法 102  实例75 数组递增排序 103  实例76 部分数组...

    java范例开发大全

    实例70 求方阵对角线之和 96 实例71 矩阵的加法 97 实例72 矩阵的减法 98 实例73 快递报价单 99 5.3 数组的排序 101 实例74 冒泡排序法 102 实例75 数组递增排序 103 实例76 部分数组递增排序 103 实例77 选择排序法...

Global site tag (gtag.js) - Google Analytics