`
lenozhi
  • 浏览: 52305 次
社区版块
存档分类
最新评论

给斐波那契函数加个缓存

阅读更多
算兔子:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

import java.util.HashMap;

public class a{
    private static HashMap<Integer,Double> map = new HashMap<Integer,Double>();
    
	public static double f(int month){
		//System.out.println("month:"+month+ "   0");
		if (month < 3){
		//	System.out.println("1");
			return 2;
		}
		if ( map.get(month-1) == null){
			//System.out.println("month:"+(month-1));
			map.put(new Integer(month-1), f(month-1));
		}
		if ( map.get(month-2) == null){
			//System.out.println("month:"+(month-2));
			map.put(new Integer(month-2), f(month-2));
		}
		
		
		double p = map.get(new Integer(month-1)).doubleValue()+map.get(new Integer((month-2))).doubleValue();
		//System.out.println("month : "+month+" p:"+p+"  2");
		return p;
	}
	
	
	public static long ff(long month){
	//	System.out.println("month:"+month+ "   0");
		if (month < 3){
		//	System.out.println("1");
			return 2;
		}
		
		long p = ff(month-1)+ff(month-2);
		//System.out.println("month : "+month+" p:"+p+"  2");
		return p;
	}
	public static void main(String args[]){
		
		System.out.println(""+"  "+f(700));
		
	}
	

}
分享到:
评论
3 楼 darren_nizna 2010-03-11  
lenozhi 写道
darren_nizna 写道
斐波那契数列的求法更好的方法是用矩阵快速乘法
F[n]= F[n-1]+ F[n-2]
可以构造矩阵:
(F[n], F[n-1])= ( F[n-1], F[n-2] )* ( 1 1 )
                                      1 0
得到 F[n]= ( F[1], F[0] )* ( 1 1 )^ (n- 1)
                            1 0


速度能提升多少倍?

递推方法是 O(n),用矩阵可以 log(n)
http://dngc.iteye.com/blog/612817
2 楼 lenozhi 2010-03-11  
darren_nizna 写道
斐波那契数列的求法更好的方法是用矩阵快速乘法
F[n]= F[n-1]+ F[n-2]
可以构造矩阵:
(F[n], F[n-1])= ( F[n-1], F[n-2] )* ( 1 1 )
                                      1 0
得到 F[n]= ( F[1], F[0] )* ( 1 1 )^ (n- 1)
                            1 0


速度能提升多少倍?
1 楼 darren_nizna 2010-03-10  
斐波那契数列的求法更好的方法是用矩阵快速乘法
F[n]= F[n-1]+ F[n-2]
可以构造矩阵:
(F[n], F[n-1])= ( F[n-1], F[n-2] )* ( 1 1 )
                                      1 0
得到 F[n]= ( F[1], F[0] )* ( 1 1 )^ (n- 1)
                            1 0

相关推荐

    VB 递归制作Fibonacci函数

    在编程领域,Fibonacci...总之,VB中的递归Fibonacci函数提供了一种简洁的方式来实现这个经典算法,但需要注意其潜在的性能问题。理解递归和迭代之间的区别,并知道何时选择哪种方法,是每个VB程序员必备的技能之一。

    python基础(补充):关于递归的优化(使用缓存).pdf

    递归优化(使用缓存) 递归是 Python 中的一种重要编程...通过使用计算缓存、functools 中装饰器、github 上的 cache 方案,我们可以将递归函数的返回值保存在一个缓存中或者一个 IO 中,从而减少计算次数,提高效率。

    算法-数论- 斐波那契数列(Fibonacci).rar

    这个数列由意大利数学家斐波那契(Leonardo Fibonacci)在13世纪引入,用于模拟兔子繁殖的问题,因此也被称为“兔子数列”。数列的定义非常简单:第一项是0,第二项是1,之后每一项都是前两项之和。用数学公式表示...

    python函数文档.zip

    Python函数文档是一个重要的资源,它包含了关于Python编程语言中函数使用的详细信息。Python是一门高级、解释型、交互式和面向对象的脚本语言,以其简洁明了的语法和强大的功能而受到全球开发者喜爱。在Python中,...

    前端开源库-lru-memoize

    // 使用lru-memoize对fibonacci函数进行记忆化 const memoizedFibonacci = lruMemoize(fibonacci, { max: 10 }); // 最大缓存10个结果 // 现在,每次调用memoizedFibonacci,都会利用LRU缓存机制 console.log...

    NDK例子之 斐波那契算法

    在NDK中,我们可以使用C或C++来优化这个问题,通过缓存已计算的值来避免重复计算。 ```c #include int fib(int n, int* memo) { if (n ) return n; if (memo[n] != 0) return memo[n]; memo[n] = fib(n - 1, ...

    javascript 用记忆函数快速计算递归函数

    memoizer函数接受两个参数:一个初始记忆数组(表示已经计算过的斐波那契数或阶乘数)和一个基础函数(用于定义递归的计算规则)。在memoizer内部定义了一个shell函数,用于处理传入的参数n。这个shell函数首先检查...

    python3实用编程技巧进阶(1套课程)\第3章-3 如何使用生成器函数实现迭代对象 Python课程 教程 进阶 0基础学习

    在这个例子中,`fibonacci`函数在每次迭代时生成一个新的斐波那契数,而不需要一次性计算整个序列。 生成器函数还有几个重要的特性: 1. **记忆功能**:由于生成器函数的状态被保留,所以它可以记住上一次`yield`的...

    vb.net(2005)源码 高精度斐波那契.rar

    这个函数接受一个参数,表示要计算的项数,然后返回最后一个斐波那契数。为了输出结果,可以使用`StreamWriter`类将结果写入到指定的文本文件(如`C:\test.txt`)。 5. **优化与性能** 为了提高效率,可以使用缓存...

    斐波那契数列python.pdf

    在给定的代码中,我们看到一个名为`fibonacci`的函数,它接受一个整数`n`作为参数,返回斐波那契数列的前`n`项。首先,函数检查输入值`n`的边界情况,对于`n返回空列表,`n=1`返回包含0的列表,`n=2`返回包含0和1的...

    cacheskell:这是我的函数式编程语言,看起来像Haskell,但是它缓存了每个函数

    这是我的函数式编程语言,看起来像Haskell,但是它缓存了每个函数。 例子 在此示例中,我们将看到递归斐波那契序列函数。 大多数编程语言都需要花费很长时间,但是cacheskell将缓存所有函数调用,从而使其相对较快...

    Fibonacci序列 分治法——C语言代码

    代码可能包含了一个或多个函数,用于根据输入的序列长度生成Fibonacci数,并可能使用了递归和记忆化技术。 在实际运行代码之前,确保你有一个支持C++编译的环境,比如Dev-C++或其他IDE。运行代码后,你可以观察输出...

    js代码-js 记忆函数

    在上述示例中,`memoize`函数是一个装饰器,用于包装原始的`fibonacci`函数,使其具有记忆功能。`cache`对象用于存储已计算的斐波那契数,每次调用`memoFibonacci`时,都会检查`cache`中是否存在对应参数的值。 2....

    C 代码 评估各种数学函数、多项式和 序列.rar

    例如,编写一个函数生成斐波那契数列,或者一个递归函数计算等差数列的和。"polpak"文件中的代码可能涉及到了这些序列计算的实现。 4. **测试代码**:"polpak_test"文件很可能是对"polpak"代码进行验证和测试的程序...

    webassembly_wasm_fibonacci:webassembly斐波那契wasm

    这个“webassembly_wasm_fibonacci”项目是关于如何使用WebAssembly来实现斐波那契数列计算的一个实例。斐波那契数列是一个数学上的序列,每个数字是前两个数字的和,通常以0和1开始:0, 1, 1, 2, 3, 5, 8, 13, 21, ...

    PyPI 官网下载 | memorize.py-1.2.tar.gz

    在这个例子中,`fibonacci`函数计算斐波那契数列,由于递归计算的特性,同一个数值可能会被多次求解。通过`@memorize`装饰器,我们可以确保每个输入值只计算一次,从而显著提升性能。 在实际应用中,`memorize`库...

    java计算斐波那契数列

    斐波那契数列是计算机科学中一个经典的概念,它在算法设计、数据分析以及许多其他领域都有广泛应用。这个数列的定义非常简单:第一项和第二项分别是0和1,之后的每一项都是前两项之和。用数学公式表示就是 F(0) = 0,...

    python利用高阶函数实现剪枝函数

    Python利用高阶函数实现剪枝函数的知识点涵盖了递归、装饰器、函数缓存、算法优化等领域,下面就这些内容进行详细阐述: 1. 高阶函数概念: 高阶函数是指那些能够接收其他函数作为参数或返回其他函数作为结果的函数...

    JavaScript学习笔记之函数记忆

    函数记忆的主要思想是,如果一个函数被多次调用,并且每次调用的参数相同,那么第二次及之后的调用可以直接从缓存中获取结果,而无需重新执行函数体。这样可以避免重复计算,尤其是对于计算量大的函数,它可以显著...

    FibonacciService:斐波那契服务

    5. **斐波那契服务接口与实现**:在实际应用中,可能需要设计一个服务接口,定义计算斐波那契数的方法,然后提供不同的实现,如线程安全的实现、缓存支持的实现等。 ```java public interface FibonacciService { ...

Global site tag (gtag.js) - Google Analytics