剑指offer笔记面试题10----斐波那契数列
题目:求斐波那契数列的第n项。写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列的定义如下:f(0) = 0, f(1) = 1,f(n) = f(n - 1) + f(n - 2)。
测试用例:
- 功能测试(如输入3、5、10等)。
- 边界值测试(如输入0、1、2)。
- 性能测试(输入较大的数字,如40、50、100等)。
测试代码:
void test(int n, int expected){
if(fibonacci_solution1(n) == expected)
printf("test for %d in solution1 passed.\n", n);
else
printf("test for %d in solution1 failed.\n", n);
if(fibonacci_solution2(n) == expected)
printf("test for %d in solution2 passed.\n", n);
else
printf("test for %d in solution2 failed.\n", n);
if(fibonacci_solution3(n) == expected)
printf("test for %d in solution3 passed.\n", n);
else
printf("test for %d in solution3 failed.\n", n);
}
本题考点:
- 考查应聘者对递归、循环的理解及编码能力。
- 考查应聘者对时间复杂度的分析能力。
- 如果面试官采用的是青蛙跳台阶的问题,那么同时还在考查应聘者的数学建模能力。
代码实现:
#include <cstdio>
#include <cassert>
//=================方法一:递归==================
long long fibonacci_solution1(unsigned int n){
if(n <= 0)
return 0;
if(n == 1)
return 1;
return fibonacci_solution1(n - 1) + fibonacci_solution1(n - 2);
}
//=================方法二:循环==================
long long fibonacci_solution2(unsigned n){
int result[2] = {0, 1};
if(n < 2)
return result[n];
long long fibMinusOne = 1;
long long fibMinusTwo = 0;
long long fibN = 0;
for(unsigned int i = 2; i <= n; ++i){
fibN = fibMinusOne + fibMinusTwo;
fibMinusTwo = fibMinusOne;
fibMinusOne = fibN;
}
return fibN;
}
//=================方法三:基于矩阵乘法=============
struct Matrix2By2{
Matrix2By2(long long m00 = 0,
long long m01 = 0,
long long m10 = 0,
long long m11 = 0)
:m_00(m00), m_01(m01), m_10(m10), m_11(m11){}
long long m_00, m_01, m_10, m_11;
};
Matrix2By2 MatrixMultiply(const Matrix2By2& matrix1,
const Matrix2By2& matrix2){
return Matrix2By2(
matrix1.m_00 * matrix2.m_00 + matrix1.m_01 * matrix2.m_10,
matrix1.m_00 * matrix2.m_01 + matrix1.m_01 * matrix2.m_11,
matrix1.m_10 * matrix2.m_00 + matrix1.m_11 * matrix2.m_10,
matrix1.m_10 * matrix2.m_01 + matrix1.m_11 * matrix2.m_11
);
}
Matrix2By2 MatrixPower(unsigned int n){
assert(n > 0);
Matrix2By2 matrix;
if(n == 1){
matrix = Matrix2By2(1, 1, 1, 0);
}
else if(n % 2 == 0){
matrix = MatrixPower(n / 2);
matrix = MatrixMultiply(matrix, matrix);
}
else if(n % 2 == 1){
matrix = MatrixPower((n - 1) / 2);
matrix = MatrixMultiply(matrix, matrix);
matrix = MatrixMultiply(matrix, Matrix2By2(1, 1, 1, 0));
}
return matrix;
}
long long fibonacci_solution3(unsigned int n){
int result[2] = {0, 1};
if(n < 2)
return result[n];
Matrix2By2 PowerNMinus2 = MatrixPower(n - 1);
return PowerNMinus2.m_00;
}
int main(){
test(0, 0);
test(1, 1);
test(2, 1);
test(3, 2);
test(4, 3);
test(5, 5);
test(6, 8);
test(7, 13);
test(8, 21);
test(9, 34);
test(10, 55);
test(40, 102334155);
test(100, 3736710778780434371);
return 0;
}
剑指offer笔记面试题10----斐波那契数列的更多相关文章
- 【剑指offer】面试题 10. 斐波那契数列
面试题 10. 斐波那契数列 题目一:求斐波那契数列的第n项 题目描述:求斐波拉契数列的第n项 写出一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项.斐波拉契数列定义如下: C++ 实现 ...
- 《剑指offer》面试题9 斐波那契数列 Java版
书中方法一:递归,这种方法效率不高,因为可能会有很多重复计算. public long calculate(int n){ if(n<=0){ return 0; } if(n == 1){ r ...
- 【剑指Offer】面试题10- I. 斐波那契数列
题目 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2) ...
- 《剑指offer》面试题10- I. 斐波那契数列
问题描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - ...
- 剑指Offer(书):斐波那契数列
题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 分析:第一种方法:递归,45时,时间为5s,50时,我就等不及了.原因是重 ...
- 剑指offer 7. 递归和循环 斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 简简单单 废话不多说,直接上代码: public class Sol ...
- 剑指offer二刷——数组专题——斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1). n<=39 我的想法 斐波那契数列定义:F(0)=0,F(1)=1, ...
- 【校招面试 之 剑指offer】第10-1题 斐波那契数列
递归以及非递归实现: #include<iostream> using namespace std; long long fun(long long n){ if(n == 0){ ret ...
- 剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)
递归与循环 递归:在一个函数的内部调用这个函数. 本质:把一个问题分解为两个,或者多个小问题(多个小问题相互重叠的部分,会存在重复的计算) 优点:简洁,易于实现. 缺点:时间和空间消耗严重,如果递归调 ...
- 剑指offer第二版面试题10:斐波那契数列(JAVA版)
题目:写一个函数,输入n,求斐波那契数列的第n项.斐波那契数列的定义如下: 1.效率很低效的解法,挑剔的面试官不会喜欢 使用递归实现: public class Fibonacci { public ...
随机推荐
- Vsftpd运行的两种模式-xinetd运行模式和 standalone模式
vsftpd运行的两种模式-xinetd运行模式和 standalone模式 vsftpd提供了standalone和inetd(inetd或xinetd)两种运行模式. standalone一次性启 ...
- python连接sqlserver和MySQL实现增删改查
参考python核心编程 编写一个用户洗牌的脚本,根据用户输入,选择连接sqlserver或者MySQL,创建数据库.表,随机生成数据,并实现增删改查. 其中,为了兼容python2和python3, ...
- Nginx入门教程-简介、安装、反向代理、负载均衡、动静分离使用实例
场景 Nginx入门简介和反向代理.负载均衡.动静分离理解 https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102790862 Ub ...
- Mysql被黑客入侵及安全措施总结
情况概述 今天登陆在腾讯云服务器上搭建的 MySQL 数据库,发现数据库被黑了,黑客提示十分明显. MySQL 中只剩下两个数据库,一个是information_schema,另一个是黑客创建的PLE ...
- 没想到Spring Boot居然这么耗内存,有点惊讶
Spring Boot总体来说,搭建还是比较容易的,特别是Spring Cloud全家桶,简称亲民微服务,但在发展趋势中,容器化技术已经成熟,面对巨耗内存的Spring Boot,小公司表示用不起.如 ...
- 本地的个人web网站上线的全过程,供大家参考(PHP,简易的LAMP环境搭建)
一 : 你需要准备的东西 1.本地能访问的网站,最好是改过host文件和apache的httpd-vhosts.conf,配置过本地域名的那种(减少传到线上出现的问题,文件路径不对呀啥的) 2.一个云 ...
- C# 读写倍福plc beckhoff , 使用ADS协议实现读取plc
本文将使用库技术来读写倍福PLC数据,使用的是基于以太网的ADS实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 github地址:https://g ...
- Spring Boot Security 保护你的程序
Spring Boot Security 本示例要内容 基于角色的权限访问控制 加密.解密 基于Spring Boot Security 权限管理框架保护应用程序 String Security介绍 ...
- git clone 仓库的部分代码
对于较大的代码仓库来说,如果只是想查看和学习其中部分源代码,选择性地下载部分路径中的代码就显得很实用了,这样可以节省大量等待时间. 比如像 Chromium 这种,仓库大小好几 G 的. clone ...
- WPF之实现控件内容拖动
以下分别记录label.listbox.treeview三个控件的拖动示例: 1.对被拖动控件,实现拖动事件,主要是通过各种鼠标事件,实现DragDrop.DoDragDrop方法. 2.对于需要拖动 ...