`

简单的递归转非递归例子 Fibonacci

    博客分类:
  • Java
阅读更多
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
*///:~

 

分享到:
评论

相关推荐

    斐波那契递归时间和非递归时间的比较(csdn)————程序.pdf

    在这个文档中,作者比较了两种计算斐波那契数列的方法:递归和非递归(也称为迭代)。递归方法通常更直观,但效率较低,而迭代方法虽然稍显复杂,但在处理大数时更有效率。 递归算法是通过调用自身来解决问题的。在...

    浅谈递归机制和非递归转换.txt

    2. **斐波那契数列**:斐波那契数列是另一个常用的递归例子。 ```c int Fibonacci(int n) { if (n ) return n; // 基本情况 return Fibonacci(n - 1) + Fibonacci(n - 2); // 递归步骤 } ``` 此处,基本情况...

    递归函数两个例子教程(VB6.0源代码编写)

    因此,对于大型数据集或深度递归,通常推荐使用迭代或其他非递归方法。 在VB6.0中,递归函数的使用需要谨慎,因为VB6.0的堆栈大小有限,过度使用递归可能导致程序崩溃。在实际编程中,可以考虑使用尾递归优化、记忆...

    c#斐波那契数列(Fibonacci)(递归,非递归)实现代码

    以上两种非递归方法都可以有效地计算斐波那契数列,但底向上非递归通常被认为是最优的,因为它只计算每个位置一次,避免了重复计算。在实际编程中,如果性能是关键因素,建议使用底向上非递归方法。

    JAVA递归与非递归实现斐波那契数列

    `feibonaci2` 方法就是非递归实现的一个例子。这里使用了一个数组 `arr` 来存储已经计算过的斐波那契数,避免了重复的递归调用。这种方法的时间复杂度是线性的,即 O(n),因此对于大值的 n,它的执行速度远快于递归...

    递归算法专题ppt

    - **非递归算法**:通常使用迭代(如循环)的方式解决问题,避免了递归带来的潜在问题,但可能不如递归算法简洁。 **实例分析**: 例如计算阶乘 n! 和累加 1+2+3+…+n 的递归与非递归实现。递归实现通过不断地自我...

    递归算法事例及理论说明

    递归算法是一种编程技术,它通过函数或子过程直接或间接地调用自身来解决问题。在计算机科学中,递归通常用于简化复杂问题的解决...在某些情况下,可以考虑使用迭代或其他非递归方法来替代递归,以提高程序的执行效率。

    斐波那契数列(前100项).rar

    斐波那契数列是一个经典的数学概念,在计算机科学和编程...通过这个例子,我们可以深入理解递归和非递归算法,以及如何在C语言中实现这些算法。同时,这也是一个很好的机会去探讨算法优化、数据结构和问题解决技巧。

    Java递归例子.pdf

    另外,还可以使用非递归的欧几里得算法,通过不断地用较大的数除以较小的数,直到余数为0,此时的较小数就是最大公约数。 以上三个例子展示了递归在不同场景下的应用。递归可以使代码简洁、易于理解,但也可能导致...

    关于递归算法时间复杂度分析的探讨.pdf

    递归算法的时间复杂度分析相较于非递归算法更为复杂,因为它涉及到多次自我调用的过程。在递归算法中,时间复杂度不仅取决于单次调用的操作数,还与递归调用的深度和次数有关。 #### 阶乘算法的时间复杂度 考虑一...

    递归函数用两种方法说明,子函数调用。VB6.0源代码编写

    因此,在编写递归函数时,应尽量减少递归深度,或者考虑其他非递归算法。 四、实际应用 递归函数在许多领域都有应用,如数据结构(如树和图的遍历)、算法(如搜索和排序)以及数学问题(如组合计数和几何问题)。...

    acm教程递归与分治

    Ackerman 函数无法通过非递归方式简单定义,体现了递归在某些问题上的本质特征。 **分治策略** 分治法是一种高级算法设计策略,它将大问题分解为若干个规模较小、结构相同的子问题,然后递归地解决这些子问题,最后...

    Java递归例子.docx

    另外提供了一个非递归实现 `gcd2`,使用迭代法更有效地计算GCD。 总结来说,递归在解决问题时能简化逻辑,但需要注意递归深度和效率。汉诺塔问题展示了如何使用递归来解决物理世界中的问题,斐波那契数列展示了递归...

    数据结构 递归算法详解

    这两个例子主要用来说明递归的基本概念,而非最佳实践。 在上述的二进制转换为ASCII字符的例子中,我们看到了递归的一个实际应用。这个程序通过递归地将一个整数除以10,每次都打印出余数对应的ASCII字符,直到商为...

    算法设计与实现-递归算法

    **递归转非递归** 虽然递归算法直观且易于理解,但有时可能会导致栈溢出或效率较低。因此,递归算法可以转换为非递归形式,通常通过使用循环和堆栈来模拟递归调用的过程。例如,上面的阶乘函数可以改写为非递归形式...

    递归算法和二分查找法

    3. 设计容易:对于递归定义的问题或数据结构,设计递归算法可能比非递归算法更为简单。 递归的实现依赖于一个称为递归工作栈的数据结构。递归过程分为两部分: 1. 递推(Traversal):问题向更小的子问题推进,这个...

    delphi递归函数应用

    递归函数的应用非常广泛,除了计算阶乘,还可以用于遍历数据结构(如树或图)、解决数学问题(如斐波那契序列)、搜索算法(如深度优先搜索)等。然而,需要注意的是,递归可能导致大量的函数调用,这可能会消耗大量...

    递归算法,用自身的结构来描述自身,称递归,VB6.0源代码编写

    - **基础案例**:经典的递归例子是计算阶乘,如`Factorial(n)`。当n为0或1时,返回1,否则返回`n * Factorial(n-1)`。 - **终止条件**:每种递归函数都需要一个明确的停止点,防止无限循环。在阶乘的例子中,`n = ...

    PHP 递归函数

    2. 效率问题:相比于非递归解决方案,递归通常执行速度较慢,因为需要频繁地创建和销毁函数实例。 3. 可读性:虽然递归在某些情况下可以使代码简洁,但对初学者来说可能较难理解。 4. 易出错:错误的递归调用可能...

    递归与分治_有助理解递归

    Ackerman函数则是双递归函数的一个例子,其定义涉及到了自身,且不存在简单的非递归形式。递归深度会随着输入参数的增长迅速增加,因此在实际应用中并不常见,但它展示了递归可以达到的复杂程度。 递归在解决问题时...

Global site tag (gtag.js) - Google Analytics