斐波那契数列的求和示例
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语言中的应用广泛,可以有效地帮助解决各种编程问题。通过学习和掌握这两种算法的使用,程序员可以更高效地利用Java语言,编写出高质量、性能...
总的来说,Java程序员在设计代码时应权衡递归和迭代的优缺点,根据实际问题选择合适的方法。同时,了解JVM的优化机制和现代编程实践,可以帮助我们编写更高效、更健壮的代码。在性能敏感的场景下,合理的代码结构和...
在Java程序设计中,递归和迭代是两种常见的解决问题的方法。递归是函数或方法直接或间接调用自身,将复杂问题分解为相似的子问题来解决,而迭代则使用循环结构逐步推进问题的解决。 1. 递归: - **递归公式**:...
在编程世界中,递归和迭代是两种基本的解决问题的方法,尤其在Java语言中,它们在算法设计中占据着核心地位。本资料包主要探讨了这两种算法的概念、区别以及它们在Java中的具体应用。 首先,我们要理解递归。递归是...
在编程中,递归和迭代是两种常见的解决问题的方法。递归是函数或程序调用自身的方式,而迭代则使用循环结构来重复执行一段代码。在Java中,有时我们需要将递归算法转换为迭代,以提高性能,减少内存消耗,或者因为...
此外,Java的`java.nio.file`包提供了更现代和高效的文件操作API,如`Files.walk()`方法,它可以方便地进行文件遍历而无需手动处理递归。使用这个API,你可以写出更简洁且性能更好的文件搜索代码。 总的来说,通过...
在Java编程中,递归和非递归是两种常用的处理问题的方法。递归通常用于解决那些可以通过分解为更小问题来解决的问题,而非递归则更适合于使用迭代的方式来解决问题。下面将详细介绍这两种方法,并通过计算阶乘的例子...
- **递归与迭代**:对比递归与迭代两种不同的解决问题的方法。 - **Java文件系统API**:深入学习Java中处理文件系统的API。 通过以上分析,我们可以看到递归算法在Java中的具体实现方式以及如何利用递归来解决实际...
这些方法接收一个输入符号流的迭代器作为参数,用于读取和消费输入符号。 - 方法内部通常包含if-else或switch-case结构,用于判断当前符号应匹配哪个文法规则分支。 - 当遇到终结符时,直接比较当前输入符号;对于...
Java递归是编程中的一个重要概念,它是指在函数或方法的定义中调用自身的过程。在Java中,递归通常用于解决那些可以被简化为规模更小的相同问题的复杂问题,例如遍历数据结构(如树和图)、计算阶乘、搜索算法等。...
在本文中,我们将深入探讨如何使用递归方法在Java中删除文件,这通常涉及到目录及其包含的所有文件和子目录的删除。以下是根据提供的代码片段提炼出的关键知识点: ### 关键知识点一:递归函数设计 递归函数`find...
在这个实例中,我们将深入探讨如何使用Java递归实现阶乘计算,并以1到10的数字为例进行演示。 阶乘是一个数学概念,表示一个正整数n的所有小于等于n的正整数的乘积,通常表示为n!。例如,5的阶乘(5!)是5 × 4 × ...
因此,在实际编程中,应谨慎使用递归,并考虑使用迭代或其他非递归方法作为替代方案。 总结来说,递归是编程中的重要概念,尤其在Java这样的面向对象语言中,它可以优雅地解决复杂问题。通过理解和应用递归,我们...
汉诺塔问题是递归的经典示例之一,涉及移动多个圆盘从一个柱子到另一个柱子,规则是每次只能移动一个圆盘,且大盘不能放在小盘之上。递归解法可以清晰地表达这一过程: ```java public static int T(int n) { if ...
哈密顿路径问题是一个经典...通过阅读和理解代码,你可以深入理解递归和迭代这两种不同的解决问题的方法,以及如何在实际编程中应用它们。此外,它也提供了一个良好的机会去实践如何在Java中有效地管理数据结构和算法。
Java中的迭代和递归是两种不同的编程方法,用于解决问题或执行任务。这两种方法都有各自的优点和缺点,适用于不同的场景。 **一、递归** 递归是一种函数自我调用的技术,通常涉及将大问题分解为相同或相似的子问题...
在Java培训中,理解递归的原理和应用至关重要。递归的定义包括以下几个关键点: 1. **函数内部调用自身**:这是递归的基础,即函数在执行过程中调用自身,形成一个调用链。 2. **边界条件**:递归必须有一个明确的...
本主题将深入探讨如何使用Java集合、JSP和JSTL来递归地创建并输出树形结构(Tree),特别是用于前端展示。 首先,我们要理解Java集合在构建树结构中的作用。在Java中,可以使用ArrayList、LinkedList或者自定义的...
Java递归算法是一种编程技术,它允许函数或方法在执行过程中调用自身。递归通常用于解决具有重复子问题的问题,通过将复杂问题分解成更小的子问题来简化处理。这种策略的关键在于存在一个终止条件,即所谓的递归基,...