斐波那契 (Fibonacci)数列

尾递归会将本次方法的结果计算出来,直接传递给下个方法。效率很快。

一般的递归,在本次方法结果还没出来的时候,就调用了下次的递归, 而程序就要将部分的结果保存在内存中,直到后面的方法结束,再返回来计算。如果递归比较大,可能会照成内存溢出。

实践证明,尾递归 ,确实比普通递归效率高。

下面的例子 ,用 普通递归需要10s完成 , 而用尾递归,只用了1s不到

package com.zf.dg;
/**
 * 题目
 *  有一种母牛,出生后第三年,开始生育,每年都生一头
	母牛(貌似单性生育,这里就没公牛什么事儿);生出来的小母牛也符合同样的规律,出生后第三年,开始生
	育,每年都生一头母牛;该种母牛是永生的,而且永远拥有生育能力,生命不止,生育不止,生生不息。第一
	年时,只有一头母牛。请问第n年时,共有母牛多少头?
	规律如下:  第n年的数量 = 第n-1年牛的数量  + 第 n -2 年牛的数量
	1 1
	2 1
	3 2
	4 3
	5 5
	6 8
 */
public class Test2 {

	/**
	 * 普通树形递归
	 * @param n
	 * @return
	 */
	public static int fun(int n){
		if(n < 3){
			return 1 ;
		}else{
			return fun(n -1) + fun(n - 2);
		}
	}

	/**
	 * 将普通树形递归变成尾递归
	 * 从第 current 年一直计算 累加 到第n年
	 * @param last		上一年牛的数量
	 * @param result		当前年的牛的数量
	 * @param current		当前第几年
	 * @param n			要计算的年数
	 * @return
	 */
	public static int fun2(int last , int result , int current , int n){
		if(n < 3){
			return 1 ;
		}else if(current == n)
			return result ;
		else{
			return fun2(result , result + last  , ++current , n );
		}
	}

	/**
	 * 将上面的方法包装
	 * 思路:从第二年开始计算 ,一直计算到第n年 ,因为第二年我们能够知道他的前上一年 牛的数量 与 当前年的数量
	 * @param n
	 * @return
	 */
	public static int fun3(int n ){
		return fun2(1 , 1 , 2 , n);
	}

	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		System.out.println(fun(45));
//		System.out.println(fun3(45));
		long end = System.currentTimeMillis();
		System.out.println("用时:" + ( end - start ) / 1000);
	}

}

  

时间: 2024-11-02 19:28:03

斐波那契 (Fibonacci)数列的相关文章

编程之美 2.9 斐波那契(Fibonacci)数列

编程之美 2.9 斐波那契(Fibonacci)数列 斐波那契的递归表达式如下 F(n)=F(n-1)+F(n-2) n>=2 F(1)=1 F(0)=0 书中提到了三中解决方法 第一种:直接运用递归的方法来进行求解 package org.wrh.programbeautiful; import java.util.Scanner; public class Topic2_9 { public static void main(String[] args) { Topic2_9 t=new T

9.求斐波那契Fibonacci数列通项

(1)递归实现: #include<iostream>using namespace std;int Fibonacci(int); int main(){    int n;    cout<<"please input an number n: "<<endl;    cin>>n; for(int i=1;i<=n;i++)    {        cout<<Fibonacci(i)<<endl; 

【编程之美】斐波那契(Fibonacci)数列

斐波那契数列是一个非常美丽.和谐的数列,有人说它起源于一对繁殖力惊人.基因非常优秀的兔子,也有人说远古时期的鹦鹉就知道这个规律. 每一个学理工科的学生都知道斐波那契数列,斐波那契数列由如下递推关系式定义: F(0)=0, F(1)=1, n>1时,F(n)=F(n-1)+F(n-2). 每一个上过算法课的同学都能用递归的方法求解斐波那契数列的第n+1项的值,即F(n). 1 int Fibonacci(int n) 2 { 3 if (n <= 0) return 0; 4 else if (

斐波那契 [ Fibonacci] 数列之大整数求和

之前做到一题, 不过由于Honor Code的缘故就不说是啥了, 很多人都知道 (-_-) 大概是说有n个牌,每个牌只有A,B两种状态. 当出现连续3个牌的状态一样时,认为不完美. 给出一个[1, 10000]的整数, 让求出完美的排列个数 那么我们就可以分析一下: /*-------------------------------------------------------------------------------分析:    首先要求出不美观的个数,但是尝试可以发现美观的排列更容易

【C语言】求斐波那契(Fibonacci)数列通项(递归法、非递归法)

意大利的数学家列昂那多·斐波那契在1202年研究兔子产崽问题时发现了此数列.设一对大兔子每月生一对小兔子,每对新生兔在出生一个月后又下崽,假若兔子都不死亡.   问:一对兔子,一年能繁殖成多少对兔子?题中本质上有两类兔子:一类是能生殖的兔子,简称为大兔子:新生的兔子不能生殖,简称为小兔子:小兔子一个月就长成大兔子.求的是大兔子与小兔子的总和. 月     份  ⅠⅡ  Ⅲ  Ⅳ  Ⅴ Ⅵ  Ⅶ  Ⅷ Ⅸ Ⅹ  Ⅺ  Ⅻ大兔对数 1  1   2   3   5  8  13  21 34 55 

如何用Python输出一个斐波那契Fibonacci数列

a,b = 0, 1 while b<100: print (b), a, b = b, a+b 原文地址:https://www.cnblogs.com/apollo1616/p/9776116.html

HDU2842之斐波那契亚数列变形,动态规划

1.原题展示: 一根棒子上有n个环(n<=10^9) 第一个环可以随意取下或者放上 如果前k个环都不在棒子上,且第k+1个环在棒子上,则你可以取下或放上第k+2个环 给出n,求最少需要多少步可以取完棒子上的环? 2.思路分析: 如果要把n个环全部拿完,那么我们必须先拿完前n-2个环(只有这样才能拿走第n个环),剩下第n-1个环未拿走.当拿走前n-2个环所花的步骤数目为f(n-2)加上最后一个环,那么所花步数为f(n-2)+1步.对于第n-1个球,如果要拿走它,必须补上前n-2个球,放进去n-2个

ACM/ICPC算法训练 之 数学很重要—斐波拉契●卢卡斯数列(HNNUOJ 11589)

看到这个标题,貌似很高大上的样子= =,其实这个也是大家熟悉的东西,先给大家科普一下斐波拉契数列. 斐波拉契数列 又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.…… 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*) 在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以<斐波纳契数列季刊>为名的一份数学杂志,用于专门刊载这方面的

算法学习#02--斐波那契Fibonacci数列算法优化

算法列表 本文从时间效率和占用空间内存角度评估,找出最优算法. 经典递归算法Recursive algorithm(很慢) 动态存储算法Dynamic programming(慢) 矩阵幂算法Matrix exponentiation(快) 倍数公式算法Fast doubling(很快) 倍数公式算法+快速乘法Fast doubling with Karatsuba(最快) Fibonacci数列 1.数列介绍 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂