剑指offer第九题Java实现

题目:

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。

public class Test9 {
public static void main(String[] args) {
Test9 test9 = new Test9();
System.out.println(test9.Fibonacci(390000));
System.out.println(test9.Fibonacci3(39));
} /**
* 为什么不采用递归?因为递归实际是大量调用自身,当数量足够大的时候,需要同时保存成千上百个调用记录,容易发生内存溢出。
* 怎么优化?
* 1. 采用尾递归,但是Java并没有基于尾递归进行优化,也就是说Java中采用递归还是无法避免很容易发生"栈溢出"错误(stack overflow)。
* 因为尾递归都是位于调用函数的最后一行,此时可以删除以前所保存的函数内变量,想当于每次只调用了一个函数。
* 2. 采用迭代
*
* @param n
* @return
*/
public int Fibonacci(int n) {
if (n <= 0) {
return 0;
}
int f1 = 0, f2 = 1;
for (int i = 1; i <= n; i++) {
f1 = f1 + f2;
f2 = f1 - f2;
}
// 下面这种写法更为巧妙
// while (n-- > 0) {
// f1 = f1 + f2;
// f2 = f1 - f2;
// }
return f1;
} /**
* 采用递归的方式
*
* @param n
* @return
*/
public int Fibonacci3(int n) {
if (n <= 0) {
return 0;
}
if (n == 1 || n == 2) {
return 1;
} else {
return Fibonacci3(n - 1) + Fibonacci3(n - 2);
}
}
}

参考文档

  1. 尾调用优化

Java迭代实现斐波那契数列的更多相关文章

  1. 算法 递归 迭代 动态规划 斐波那契数列 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. Java练习 SDUT-1132_斐波那契数列

    C/C++经典程序训练2---斐波那契数列 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 编写计算斐波那契(Fibon ...

  3. Java学习之斐波那契数列实现

    描述 一个斐波那契序列,F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n>=2),根据n的值,计算斐波那契数F(n),其中0≤n≤1000. 输入 输入 ...

  4. (java版)斐波那契数列

    用JAVA编写Fibonacei(1,1,2,3,5,8,13...)数列的第n项 分析:当n=1时,a(n)=1;当n=2时 ,a(n)=2. 所以当n=>3时,a(n)=a(n-1)+a(n ...

  5. 简单Java算法程序实现!斐波那契数列函数~

    java编程基础--斐波那契数列 问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路:可能出现的情况:(1) n=1 ,一种方法 ;(2)n=2 ...

  6. 斐波那契数列 的两种实现方式(Java)

    import java.util.Scanner; /* 斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 如果设F(n)为该数列的第n ...

  7. java大数 斐波那契数列

    java大数做斐波那契数列:  思路:1.       2.可以用数组存着 import java.math.BigInteger; import java.util.Scanner; public ...

  8. Java面试题:小白不得不懂的斐波那契数列

    很长一段时间里,我都非常疑惑:“我写的技术文章不差啊,有内容的同时还很有趣,不至于每篇只有区区几十个人读啊?为什么有些内容简单到只有一行注册码的文章浏览量反而轻松破万?”这样的疑惑如鲠在喉啊!写技术博 ...

  9. 几种复杂度的斐波那契数列的Java实现

    一:斐波那契数列问题的起源 13世纪初期,意大利数论家Leonardo Fibonacci在他的著作Liber Abaci中提出了兔子的繁殖问题: 如果一开始有一对刚出生的兔子,兔子的长大需要一个月, ...

随机推荐

  1. 2019-1-92.4G射频芯片培训资料

    2019-1-92.4G射频芯片培训资料 培训 RF 小书匠  欢迎走进zozo的学习之旅. 2.4G芯片选型 2.4G芯片开发 Q&A 2.4G芯片选型 芯片类型 soc 防盗标签2.4G无 ...

  2. C语言文件基本操作

    1.用文本方式储存‘1’,‘0’,‘2’存入文件,然后用二进制方式从文件开头读出一个short型数据,并验证结果是否正确 #include<stdio.h> #include<str ...

  3. Coprime Sequence(前后缀GCD)

    Description Do you know what is called ``Coprime Sequence''? That is a sequence consists of $n$ posi ...

  4. mysql唯一查询

    MySQL单一字段唯一其他字段差异性忽略查询.在使用MySQL时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返 ...

  5. javaIO--字节流

    流---是指的一组有序的.有气垫和重点的字节集合,是对的护具传输的总称或者抽象. 流采用缓冲区技术,当写一个数据时,系统将数据发送到缓冲区而不是外部设备(如硬盘),当读一个数据时,系统实际是从缓冲区读 ...

  6. 数字证书认证这点事, SSL/TLS,OpenSSL

    1.概念 数字证书 HTTPS请求时,Server发给浏览器的认证数据,用私钥签名,并且告诉浏览器公钥,利用公钥解密签名,确认Server身份. 证书还会指明相应的CA,CA能确认证书是否真的是CA颁 ...

  7. 【WCF】WCF 附录 高级主题 配置服务配额设置

    微软产品自带一个“默认安全”方案.这也包括了WCF,意味着WCF中的多种配置可以设置来阻止诸如DOS(拒绝服务访问)攻击.微软为很多基于一个单一计算机的开发环境选择这样的设置.这也意味着默认设置中的一 ...

  8. Codeforces Round#516 Div.1 翻车记

    A:开场懵逼.然后发现有人1min过,于是就sort了一下,于是就过了.正经证明的话,考虑回文串两端点一定是相同的,所以最多有Σcnti*(cnti+1)/2个,cnti为第i种字母出现次数.而sor ...

  9. BZOJ4573:[ZJOI2016]大森林——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4573 https://www.luogu.org/problemnew/show/P3348#sub ...

  10. Mysql 语句优化技巧

    前言 有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧. 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础. 优化目标 ...