简单东西-斐波那契函数实现

CSDN首页的极客头条里看到一个问题,实现斐波那契函数,并且计算n等于100时的函数值。简单地想了下,所能想到的就是使用递归完成。用递归实现,测试发现递归效率非常低,尤其是当计算的N稍微大点时,计算N=100差不多耗费了3000秒。而且需要考虑长度问题,返回值不能用int,溢出的临界是N=50。

无意中逛CSDN的问答频道,恰好也看到一个斐波那契函数的问题,而且不是用递归而是用临时中间变量存储每次计算得到的中间值,测试发现这比递归快多了,计算N=100,瞬间出结果。

三种实现方法如下:

public class FaciaLine {
	public static int fabonacci0(int n){
		if(n<1){
			throw new IllegalArgumentException("cant be zero.");
		}

		if(n==1){
			return 0;
		}

		if(n==2){
			return 1;
		}

		return fabonacci0(n-1)+fabonacci0(n-2);
	}

	public static long fabonacci1(int n){
		if(n<1){
			throw new IllegalArgumentException("cant be zero.");
		}

		if(n==1){
			return 0;
		}

		if(n==2){
			return 1;
		}

		return fabonacci1(n-1)+fabonacci1(n-2);
	}

	public static long fabonacci(int n){
		long f1 = 0;
		long f2 = 1;
		if(n<1){
			throw new IllegalArgumentException("cant be zero.");
		}

		if(n<3){
			return n==1?f1:f2;
		}

		for (int i = 3; i <= n; i++) {
	        long f3;
	        f3 = f2;
	        f2 = f1 + f2;
	        f1 = f3;
	        System.out.println("第" + i + "月的兔子数量是:" + f2);
	    }

		return f2;
	}

	public static void main(String[] args) {
		int i = 100;
		long start = System.currentTimeMillis();
		long result = fabonacci(i);
		long end = System.currentTimeMillis();
		System.out.println("fabonacci( "+i+"  ),"+result+",takes:"+(end-start)/1000);
	}
}

递归效率比不上直接使用,简单验证了下。上述代码还存在一个问题,比较long的长度有限,到某个N=94的时候,还是会出现溢出问题,所以还是应该考虑更大长度的类型或者限制N的输入。

最近逛CSDN问答频道收获颇多,在回答C友们问题的同时顺便巩固了自己的基础知识,偶尔还能温故而知新。以往工作中只关注写代码去了,没有融会思考基础。近期看到许多Java基础的问题,跟贴回答或者看其它朋友的回答,对于某些基础、各个框架之间突然就能想起它们之间的关联以及底层原理。

时间: 2024-10-12 22:05:22

简单东西-斐波那契函数实现的相关文章

斐波那契函数的应用

题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙上一次n级的台阶总共有多少种跳法? 分析:首先考虑最简单的额情况.如果只有1级台阶,那显然只有一种跳法:如果有2级台阶,那就有两种跳法:跳一级再跳一级:一次性跳到第2级: 接下来讨论一般情况,把n级台阶时的跳法看成是n的函数:记作f(n).当n > 2时,第一次跳的时候有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的数目:即为f(n-1): 另一种选择是第一次跳2级,此时跳法数目等于后面剩下的n-2级数台阶

斐波那契函数的优化

Android开发者使用java开发,但是Android平台并没有使用java虚拟机来执行代码,而是把代码编译成Android使用的虚拟机的字节码(Dalvik 虚拟机).java代码先是被编译成了java的字节码,然后会被odex 编译器编译成delvik虚拟机执行的字节码.无论是Android中还是java中程序的性能优化都是必不可少的一大难题.我们先从简单的斐波那契数列来简做分析: 1.什么是斐波那契数列? a)?例如 0 ?1 ?2 ?3 ?5 ?8 ?13 ..... 这样的数列.第一

04斐波那契函数_Fibonacci--(栈与队列)

#include "stdio.h" int Fbi(int i) /* 斐波那契的递归函数 */ { if( i < 2 ) return i == 0 ? 0 : 1; return Fbi(i - 1) + Fbi(i - 2); /* 这里Fbi就是函数自己,等于在调用自己 */ } int main() { int i; int a[40]; printf("迭代显示斐波那契数列:\n"); a[0]=0; a[1]=1; printf("

高级算法——动态规划(斐波那契函数实例)

//使用递归去解决问题虽然简洁, 但效率不高,转为动态规划较好 function recurFib(n) {//斐波那契数列——递归 if (n <= 2) { return 1; } else { return recurFib(n - 1) + recurFib(n - 2); } } function dynFib(n) {//斐波那契数列——动态规划 var val = []; if (n == 1 || n == 2) { return 1; } else { val[1] = 1;

斐波那契函数.

<?php //数组版 function fib($n){ $array = array(); $array[0]=0; $array[1]=1; for($i=2;$i<=$n;$i++){ $array[$i]= $array[$i-1]+$array[$i-2]; } print_r($array); } fib(10); echo "<hr>"; //普通版 function fib2($n){ if($n==1||$n==2){return 1;} e

从斐波那契开始了解尾递归

尾递归(tail recursive),看名字就知道是某种形式的递归.简单的说递归就是函数自己调用自己.那尾递归和递归之间的差别就只能体现在参数上了. 尾递归wiki解释如下:豪享博娱乐城 尾部递归是一种编程技巧.递归函数是指一些会在函数内调用自己的函数,如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归.尾部递归的函数有助将算法转化成函数编程语言,而且从编译器角度来说,亦容易优化成为普通循环.这是因为从电脑的基本面来说,所有的循环都是利用重复移跳到代码的开头来实现的.如果有尾部归

谨慎地使用递归之斐波那契递归实现的分析

[斐波那契函数的定义] 斐波那契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=1,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*). [用递归求解斐波那契函数的弊端] 斐波那契函数用递归实现如下面的代码: 计算斐波那契的自然递归程序效率时很低的,上面的程序虽然写法简单,看上去时递归的聪明的使用,但其实效率是及其低下的.特别是当n=40以后,效率衰减的特别明显.为了计算 fib( n ) ,

yield和python(如何生成斐波那契數列)

您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield 的概念. 如何生成斐波那契數列 斐波那契(Fibonacci)數列是一个非常简单的递归数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到.用计算机程序输出斐波那契數列的前 N 个数是一个非常简单的问题,许多初学者都可以轻易写出如下函数: 清单 1. 简单输出斐波那契數列前 N 个数 def

如何生成斐波那契數列和yield的用法

原文链接http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/#icomments 第一个生成斐波那契數列的方法 您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield 的概念. 如何生成斐波那契數列 斐波那契(Fibonacci)數列是一个非常简单的递归数列,除第一个和第二