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

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

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

下面的例子 ,用 普通递归需要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);
} }

  

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

  1. 斐波那契(Fibonacci)数列的几种计算机解法

    题目:斐波那契数列,又称黄金分割数列(F(n+1)/F(n)的极限是1:1.618,即黄金分割率),指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.…….在数学上,斐波纳契数列以如下 ...

  2. 斐波那契(Fibonacci)数列的七种实现方法

    废话不多说,直接上代码 #include "stdio.h" #include "queue" #include "math.h" usin ...

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

    a,b = 0, 1 while b<100: print (b), a, b = b, a+b

  4. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  5. ACM/ICPC 之 数论-斐波拉契●卢卡斯数列(HNNUOJ 11589)

    看到这个标题,貌似很高大上的样子= =,其实这个也是大家熟悉的东西,先给大家科普一下斐波拉契数列. 斐波拉契数列 又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.… ...

  6. 递归函数练习:输出菲波拉契(Fibonacci)数列的前N项数据

    /*====================================================================== 著名的菲波拉契(Fibonacci)数列,其第一项为0 ...

  7. [洛谷P3938]:斐波那契(fibonacci)(数学)

    题目传送门 题目描述 小$C$养了一些很可爱的兔子.有一天,小$C$突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子 ...

  8. HZOJ 斐波那契(fibonacci)

    先说一个规律: 如图将每个月出生的兔子的编号写出来,可以发现一只兔子在哪一列他的父亲就是谁. 每列的首项可以通过菲波那契求得. 然后你就可以像我一样通过这个规律打表每个点的父亲,预处理出倍增数组,倍增 ...

  9. 【模拟8.03】斐波那契(fibonacci) (规律题)

    就是找规律,发现每个父亲和孩子的差值都是距儿子最大的fibonacc 也是可证的 f[i]表示当前月的兔子总数 f[i]=f[i-1]+f[i-2](f[i-2]是新生的,f[i-1]是旧有的) 然后 ...

随机推荐

  1. 如何从一个1G的文件中找到你所需要的东西

    如何从一个1G的文件中找到你所需要的东西,这个问题貌似面试的时候会经常问到.不过不论你用什么语言,肯定逃脱不了按指针读或者按块读. 这里介绍python的用法.本人亲自实验了,速度还可以. 如果你的文 ...

  2. 征信报告页面的input验证收集

    https://ipcrs.pbccrc.org.cn/ function checkLoginName() { var loginName = $.trim($("#loginname&q ...

  3. js中有特殊字符的编码格式

    在get和post方法中,如果传入的参数值有特殊字符,如:“&”,在get中的url需要拼接,可以使用encodeURICompontent来编码来转化 回调就是在上面传递实际参数,传递给aj ...

  4. C# SqlBulkCopy类批量导入数据

    特别注意  sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); 插入的时候列的顺序可 ...

  5. Junit 内部解密之一: Test + TestCase + TestSuite

    转自:http://blog.sina.com.cn/s/blog_6cf812be0100wbhq.html nterface: Test 整个测试的的基础接口 Method 1: abstract ...

  6. IIS中使用ASP.NET MVC的经验总结

    在这篇文章中我们学习在不同版本的IIS中使用ASP.NET MVC和URL Routing.我们学习针对IIS7.0.IIS6.0和更早版本的IIS的处理策略. ASP.NET MVC框架依赖于URL ...

  7. iOS8的autolayout和size class

    前一阵子看到几篇不错的布局教程,Mark下. 初探iOS8中的size class 自适应布局(Adaptive Layout)教程1 自适应布局(Adaptive Layout)教程2 为iPhon ...

  8. Trie树学习

    这几天在看Hadoop的排序,用到了有TotalSortPartition,其中用到了一种叫做trie树的数据结构,每次看到这种自己之前没有听过的数据结构就想去看一下原理,然后再网上看几篇博客,有时间 ...

  9. do{}while(0)与CC_BREAK_IF的绝妙搭配

    从一開始认为没有必要,到认为很好用.我经历了大概两个月的时间,以下来总结一下什么情况下使用这样的结构吧. 第一种情况:当载入文件的时候,假设载入文件失败,须要报错的时候. 当前,能够用try{}cat ...

  10. HTTP Status Codes 状态码

    Network Connect Timeout Error