剑指offer--斐波那契数列

记录来自《剑指offer》的算法题。

题目如下:

写一个函数,输入n,实现斐波那契数列的第n项。

斐波那契数列的定义如下:

f(n)=01f(n1)+f(n2)n=0n=1n>1

教科书上通常在介绍递归的时候都会使用斐波那契数列作为例子,然后给出下列解法:

long long Fibonacci(unsigned int n){if(n<=0)return 0;if(n == 1)return 1;return Fibonacci(n-1) + Fibonacci(n-2);
}

但这个算法在n的增大后会变得很慢,主要原因是重复的计算比较多,改进算法如下所示:

// 改进版本
long long FibonacciOptimz(unsigned int n){int result[2] = { 0, 1 };if (n < 2)return result[n];long long fibNMinusOne = 1;long long fibNMinusTwo = 0;long long fibN = 0;for (unsigned int i = 2; i <= n; i++){fibN = fibNMinusOne + fibNMinusTwo;fibNMinusTwo = fibNMinusOne;fibNMinusOne = fibN;}return fibN;
}
// 测试
int main(void){int n = 10;cout << "use Fibonacci(), n = " << n << ", result = " << Fibonacci(n) << endl;cout << "use FibonacciOptimz(), n = " << n << ", result = " << FibonacciOptimz(n) << endl;cout << "start to test:\n";int test[] = { 0, 1, 2, 3, 5, 10, 40, 50, 100 };for (int i = 0; i < 9; i++){int num = test[i];cout << "use FibonacciOptimz(), num = " << num << ", result = " << FibonacciOptimz(num) << endl;}system("pause");return 0;
}

这种算法的时间复杂度是O(n),它采用循环的方法,每次循环的时候都保存中间值,并用于下次的计算。

对于斐波那契数列的应用,还有如下问题:

一只青蛙一次可以跳上一级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。

这个问题也就是需要实现斐波那契数列。考虑最简单的情况,如果只有1级台阶,那显然只有一种跳法;如果有2级台阶,则有两种跳法,一次只跳1级和1次跳两级台阶。现在讨论一般情况,将n级台阶时的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候有两种选择,一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即f(n1);另一种选择是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n2)。因此n级台阶的不同跳法的总数f(n)=f(n1)+f(n2),也就是斐波那契数列。

当然,如果上述问题的条件变成:青蛙一次可以跳上1级台阶,也可以跳上2级它也可以跳上n级,问跳上n级台阶总共有多少种跳法。通过数学归纳法可以得到f(n)=2n1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java jdbc6_Java学习-JDBC

JDBC1、数据库驱动应用程序通过驱动连接到数据库&#xff0c;进而操作数据库。2、JDBC简化开发人员对数据库的操作&#xff0c;提供了一个java操作数据库的规范&#xff0c;俗称JDBC对于程序猿&#xff0c;只需要学习JDBC提供的接口。java.sqljavax.sqlpublic class DemoJdbc01…

Unity3D For Android 开发教程【转http://game.ceeger.com/Unity/Doc/2011/Unity3D_For_Android.html】...

Unity3D For Android 开发教程 Date:2011-08-01 04:33我自认为抵挡诱惑的能力还是很强大的&#xff0c;关键的时候还能把持住自己。今天逛了一下南京的丹凤街&#xff0c;终于受不住Android这美眉的诱惑。她虽脸蛋不怎么滴&#xff0c;但身材火热&#xff0c;且性感&#xff0c…

剑指offer--二进制中1的个数

记录来自《剑指offer》上的算法题。 题目如下&#xff1a; 请实现一个函数&#xff0c;输入一个整数&#xff0c;输出该数二进制表示中1的个数。例如把9表示成二进制是1001&#xff0c;有两位是1&#xff0c;因此如果输入9&#xff0c;函数输出是2。 这道题目的一个基本思路是…

CentOS 6.4 编译安装 gcc-4.8.0

1.首先下载源代码 wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.0/gcc-4.8.0.tar.bz22.解压 tar -jxvf gcc-4.8.0.tar.bz23.下载编译所需的依赖项 cd gcc-4.8.0  ./contrib/download_prerequisites  cd ..4.建立编译输出目录 mkdir gcc-build-4.8.05.进入此目录&#xff0c;执…

剑指offer--数值的整数次方

记录来自《剑指offer》上的算法题。 题目描述&#xff1a; 实现函数 double Power(double base, int exponent), 求 base的 exponent次方。不得使用库函数&#xff0c;同时不需要考虑大数问题。 下面是一种解法&#xff1a; // 判断num1是否等于num2 bool equal(double num1,…

jackson java网络接口_java~jackson实现接口的反序列化

jackson是springboot中集成的序列化方式&#xff0c;是默认的json序列化方式&#xff0c;当然你可以使用其它的序列化工具代替它&#xff0c;不过今天我们还是说一下它&#xff0c;使用jackson进行序列化一个类&#xff0c;然后再把它的JSON字符反序列化为它的接口对象。现实这…

剑指offer--打印1到最大的n位数

记录来自《剑指offer》上的算法题。 题目如下&#xff1a; 输入数字n&#xff0c;按顺序打印出从1到最大的n位十进制数。比如输入3&#xff0c;则打印出1&#xff0c;2&#xff0c;3一直到最大的3位数即999。 第一种解法是比较容易想到&#xff0c;但是遇到大数问题的时候会有…

java判断闰年通过多态方法_04748《Java语言程序设计》实验指导书.doc

04748《Java语言程序设计》实验指导书.docJava语言程序设计实验指导书前言一、上机实验目的上机实验的目的是提高学生的分析问题、解决问题的能力和动手能力&#xff0c;通过实践环节理解 Java语言的基本结构和程序设计方法。通过亲手编程掌握 Java 程序设计编程的方法。二、实…

利用宏定义在编译阶段检查结构体大小的方法

http://blog.csdn.net/crazycoder8848/article/details/8292770 typedef struct {char a[100]; } T_XXX;typedef struct {char a[99]; } T_QQQ;/* 检测结构体的大小是否等于特定值 */ #define SIZE_OF_TYPE_EQUAL_TO(type, size) \ static inline char size_of_##type##_eq…

剑指offer--在O(1)时间内删除链表结点

记录来自《剑指offer》上的算法题。 题目如下&#xff1a; 给定单向链表的头指针和一个结点指针&#xff0c;定义一个函数在O(1)时间删除该结点。 结点定义如下&#xff1a; struct ListNode{int m_nValue;ListNode* m_pNext; }; 最常规的删除链表结点方法是从头结点开始遍历…

Designer设计无代码工作流

1. 打开Designer&#xff0c;选择工作流&#xff0c;选择列表工作流&#xff0c;选择你要将此工作流应用的列表&#xff08;这里我选择报销单&#xff09;。 填写好工作流名称&#xff0c;点击确定。 现在我们开始正式设计工作流&#xff0c;首先我们拉一个记录历史到工作流中&…

剑指offer--调整数组顺序使奇数位于偶数前面

记录来自《剑指offer》的算法题。 题目如下&#xff1a; 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。 最简单的思路就是从头开始扫描整个数组&#xff0c;当碰到偶…

java proguard 使用_使用proguard混淆java9代码

序本文主要研究一下如何使用proguard混淆java9代码mavencom.github.wvengenproguard-maven-pluginpackageproguard6.0.1${project.build.finalName}.jar${project.build.finalName}.jar!META-INF/maven/**,!module-info.classtrue${project.basedir}/proguard.cfg${java.home}/…

75个移动App开发教程

原文地址&#xff1a;http://www.goodfav.com/zh/app-development-tutorials-3559.html 移动应用程序开发是大企业和创意的个人和小团队开发&#xff0c;是一个有很多商业机会的领域之一。它可能需要多次尝试设计来实施一个出类拔萃的应用程序&#xff0c;但是&#xff0c;如果…