package org.vocano.java.tst.recursion; public class Fibonacci { public static int recursive(int n) { if(n < 2) return 1; return recursive(n-2) + recursive(n-1); } public static int directly(long n) { if(n < 3) return 1; int result = 0; int a1 = 1, a2 = 1; for (int i = 2; i <= n; i++) { result = a2 + a1; a1 = a2; a2 = result; } return result; } public static void main(String[] args) { long start = System.currentTimeMillis(); System.out.println(recursive(40)); long end = System.currentTimeMillis(); System.out.println(end - start); System.out.println(directly(40)); System.out.println(System.currentTimeMillis() - end); } } /* output: 165580141 1401 -1109825406 0 *///:~
相关推荐
在这个文档中,作者比较了两种计算斐波那契数列的方法:递归和非递归(也称为迭代)。递归方法通常更直观,但效率较低,而迭代方法虽然稍显复杂,但在处理大数时更有效率。 递归算法是通过调用自身来解决问题的。在...
2. **斐波那契数列**:斐波那契数列是另一个常用的递归例子。 ```c int Fibonacci(int n) { if (n ) return n; // 基本情况 return Fibonacci(n - 1) + Fibonacci(n - 2); // 递归步骤 } ``` 此处,基本情况...
因此,对于大型数据集或深度递归,通常推荐使用迭代或其他非递归方法。 在VB6.0中,递归函数的使用需要谨慎,因为VB6.0的堆栈大小有限,过度使用递归可能导致程序崩溃。在实际编程中,可以考虑使用尾递归优化、记忆...
以上两种非递归方法都可以有效地计算斐波那契数列,但底向上非递归通常被认为是最优的,因为它只计算每个位置一次,避免了重复计算。在实际编程中,如果性能是关键因素,建议使用底向上非递归方法。
`feibonaci2` 方法就是非递归实现的一个例子。这里使用了一个数组 `arr` 来存储已经计算过的斐波那契数,避免了重复的递归调用。这种方法的时间复杂度是线性的,即 O(n),因此对于大值的 n,它的执行速度远快于递归...
- **非递归算法**:通常使用迭代(如循环)的方式解决问题,避免了递归带来的潜在问题,但可能不如递归算法简洁。 **实例分析**: 例如计算阶乘 n! 和累加 1+2+3+…+n 的递归与非递归实现。递归实现通过不断地自我...
递归算法是一种编程技术,它通过函数或子过程直接或间接地调用自身来解决问题。在计算机科学中,递归通常用于简化复杂问题的解决...在某些情况下,可以考虑使用迭代或其他非递归方法来替代递归,以提高程序的执行效率。
斐波那契数列是一个经典的数学概念,在计算机科学和编程...通过这个例子,我们可以深入理解递归和非递归算法,以及如何在C语言中实现这些算法。同时,这也是一个很好的机会去探讨算法优化、数据结构和问题解决技巧。
另外,还可以使用非递归的欧几里得算法,通过不断地用较大的数除以较小的数,直到余数为0,此时的较小数就是最大公约数。 以上三个例子展示了递归在不同场景下的应用。递归可以使代码简洁、易于理解,但也可能导致...
递归算法的时间复杂度分析相较于非递归算法更为复杂,因为它涉及到多次自我调用的过程。在递归算法中,时间复杂度不仅取决于单次调用的操作数,还与递归调用的深度和次数有关。 #### 阶乘算法的时间复杂度 考虑一...
因此,在编写递归函数时,应尽量减少递归深度,或者考虑其他非递归算法。 四、实际应用 递归函数在许多领域都有应用,如数据结构(如树和图的遍历)、算法(如搜索和排序)以及数学问题(如组合计数和几何问题)。...
Ackerman 函数无法通过非递归方式简单定义,体现了递归在某些问题上的本质特征。 **分治策略** 分治法是一种高级算法设计策略,它将大问题分解为若干个规模较小、结构相同的子问题,然后递归地解决这些子问题,最后...
这两个例子主要用来说明递归的基本概念,而非最佳实践。 在上述的二进制转换为ASCII字符的例子中,我们看到了递归的一个实际应用。这个程序通过递归地将一个整数除以10,每次都打印出余数对应的ASCII字符,直到商为...
**递归转非递归** 虽然递归算法直观且易于理解,但有时可能会导致栈溢出或效率较低。因此,递归算法可以转换为非递归形式,通常通过使用循环和堆栈来模拟递归调用的过程。例如,上面的阶乘函数可以改写为非递归形式...
3. 设计容易:对于递归定义的问题或数据结构,设计递归算法可能比非递归算法更为简单。 递归的实现依赖于一个称为递归工作栈的数据结构。递归过程分为两部分: 1. 递推(Traversal):问题向更小的子问题推进,这个...
递归函数的应用非常广泛,除了计算阶乘,还可以用于遍历数据结构(如树或图)、解决数学问题(如斐波那契序列)、搜索算法(如深度优先搜索)等。然而,需要注意的是,递归可能导致大量的函数调用,这可能会消耗大量...
- **基础案例**:经典的递归例子是计算阶乘,如`Factorial(n)`。当n为0或1时,返回1,否则返回`n * Factorial(n-1)`。 - **终止条件**:每种递归函数都需要一个明确的停止点,防止无限循环。在阶乘的例子中,`n = ...
2. 效率问题:相比于非递归解决方案,递归通常执行速度较慢,因为需要频繁地创建和销毁函数实例。 3. 可读性:虽然递归在某些情况下可以使代码简洁,但对初学者来说可能较难理解。 4. 易出错:错误的递归调用可能...
Ackerman函数则是双递归函数的一个例子,其定义涉及到了自身,且不存在简单的非递归形式。递归深度会随着输入参数的增长迅速增加,因此在实际应用中并不常见,但它展示了递归可以达到的复杂程度。 递归在解决问题时...
因此,对于那些计算量较大或需要多次重复计算的问题,通常需要考虑使用非递归算法,如动态规划等。 总结起来,栈与递归是编程中的重要概念,它们在理解和解决复杂问题时发挥着关键作用。通过递归,我们可以将问题...