面试题:斐波那契数列

news2024/11/26 23:46:55

题目描述:

写一个函数,输入n,求斐波那契数列的第n项.斐波那契数列定义如下:

F(0) = 0
F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

解题方法:

算法1:

利用递归实现,这个方法效率有严重问题,时间复杂度为O(2^n)

long long Fibon(int n)
{
    if (n < 2)
        return n;
    return Fibon(n - 2) + Fibon(n - 1);
}

int main()
{
    for (int i = 1; i < 10; i++)//这个测试没有问题
        printf("%lld ",Fibon(i));

    printf("%lld\n",Fibon(50));//递归函数执行速度非常慢

    return 0;
}
算法2:

利用动态规划,循环实现.O(n),O(1)

long long Fibon(int n)
{
    long long f1 = 1; //第一项数据
    long long f2 = 1; //第二项数据
    long long f3 = 1; //当前项数据
    for (int i = 3; i <= n; i++)
    {
        f3 = f1 + f2;//当前项=前两项之和
        f1 = f2;//f1递推为后一项的值
        f2 = f3;//f2递推为后一项的值
    }
    return f3;
}

int main()
{
    for (int i = 1; i < 10; i++)//这个测试没有问题
        printf("%lld ",Fibon(i));
    printf("\n");
    printf("%lld\n",Fibon(50));//递归函数执行速度非常慢

    return 0;
}

image.png

算法3:

利用数学矩阵公式求解.O(logn)

这个公式比较生僻,大家了解一下.

image.png


//这个算法难度较大,仅做参考
long long* Multi(long long* arr, int n)
{
    long long* brr = (long long*)malloc(4 * sizeof(long long));
    if (brr == NULL) return NULL;
    brr[0] = brr[1] = brr[2] = 1;
    brr[3] = 0;
    if (n == -1) {
        brr[0] = 0;
        return brr;
    }
    else if (n == 0 || n==1)
        return brr;
    long long* crr = Multi(arr, n / 2);
    //计算crr*crr
    brr[0] = crr[0] * crr[0] + crr[1] * crr[2];
    brr[1] = crr[0] * crr[1] + crr[1] * crr[3];
    brr[2] = crr[2] * crr[0] + crr[3] * crr[2];
    brr[3] = crr[2] * crr[1] + crr[3] * crr[3];
    if (n % 2 != 0)//奇数,brr = brr*arr
    {
        crr[0] = brr[0] * arr[0] + brr[1] * arr[2];
        crr[1] = brr[0] * arr[1] + brr[1] * arr[3];
        crr[2] = brr[2] * arr[0] + brr[3] * arr[2];
        crr[3] = brr[2] * arr[1] + brr[3] * arr[3];
        brr[0] = crr[0];
        brr[1] = crr[1];
        brr[2] = crr[2];
        brr[3] = crr[3];
    }
    free(crr);
    return brr;
}

int Fibon(int n){
    long long arr[] = {1,1,1,0};
    long long* p = Multi(arr,n-1);
    int tmp = p[0];
    free(p);
    return tmp;
}
int main()
{
    for (int i = 1; i < 10; i++)
        printf("%lld ",Fibon(i));
    printf("\n");
    printf("%lld\n",Fibon(50));
    printf("%lld\n", Fibon(51));

    return 0;
}

image.png

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

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

相关文章

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.5, 汇编 led.s,第一次点亮LED灯

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

Linux命令大全 以及搭建hadoop

Liunx系统目录 ├── bin -> usr/bin # 用于存放二进制命令 ├── boot # 内核及引导系统程序所在的目录 ├── dev # 所有设备文件的目录&#xff08;如磁盘、光驱等&#xff09; ├── etc # 配置文件默认路径、服务启动命令存放目录 ├── home # 用户家目录&#…

Linux驱动开发——(六)按键中断实验

目录 一、简介 二、修改设备树 2.1 添加pinctrl节点 2.2 添加KEY设备节点 2.3 检查是否被其他外设使用 三、代码 3.1 驱动代码 3.2 测试代码 3.3 平台测试 一、简介 以I.MX6U-MINI为例&#xff0c;实现KEY0按下后&#xff0c;设备识别到并将数据发送到平台。 二、修…

字典及GitHub字典爬取工具

红队API接口Fuzz字典可以用于WEB安全&#xff0c;渗透测试&#xff0c;SRC等场景 完整文件已上传知识星球&#xff0c;需要的朋友可加入查看。

fetch请求后端返回文件流,并下载。

前端&#xff1a; <script src"~/layui/layui.js"></script> <script src"~/Content/js/common/js/vue.min.js"></script> <script src"~/Content/js/common/js/jquery-1.10.2.min.js"></script><styl…

jvisualvm安装插件

1、打开VisualVM: Plugins Centers 找到对应JDK版本的插件点击下载即可&#xff0c;本案例以JDK1.8.0_181为例子&#xff0c;点击进去&#xff0c;再找到需要安装的插件点击下载 2、打开jvisualvm 在工具——》插件 的【已下载】tab&#xff0c;点击【添加插件 】安装下载下来 …

前端入门:HTML(css轮廓,填充,宽高)

1.CSS轮廓 注意&#xff1a; outline中&#xff0c;out-style是必须要设置的&#xff0c;格式为&#xff1a; outline-style一共有以下的几个值&#xff1a; 2.CSS填充属性 这是一个用于在一个元素的内容周围产生空间&#xff0c;也就是边框内到白框外之间的距离&#xff0c;…

Vue2 - 完成实现ElementUI中el-dialog弹窗的拖拽功能(宽度高度适配,且关闭后打开位置居中)

我们在做后台管理系统时常用到ElementUI 中的 el-Dialog,但是官方文档并未我们提供 el-Dialog弹窗如何实现拖拽功能,我们通常需要思考如何让用户能够自由地拖动弹窗,在页面上调整位置以获得更好的用户体验。在下面的博客文章中,我们将实现如何为 ElementUI 的 el-Dialog 弹…

uniapp自定义返回事件(封装)

uniapp自定义返回事件 在我们使用uniapp时&#xff0c;我们导航栏一般都是自定义的&#xff0c;比如用uview框架的导航栏&#xff0c;那么返回事件通常会遇到以下几个问题 返回事件前需要做一些额外的处理 h5项目刷新页面后返回失效 返回按钮点击后到指定页面 如果只是监听返…

【简单介绍下日常的启发式算法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

PostgreSQL 14 向量相似度搜索插件 (pgvector) 安装指南

本文是关于在 PostgreSQL 14 中安装并使用向量相似度搜索插件(pgvector)的详细指南。此插件允许用户在数据库中执行高效的向量运算,特别适用于机器学习模型的向量数据存储与检索场景。 环境需求 已安装PostgreSQL 14或更高版本。安装了Visual Studio 2022,用于编译插件。安装…

排序算法:插入、希尔、选择、推排、冒泡、快速、归并排序

排序算法 目录 前言 一、排序的概念 1.1排序的概念 1.2 常见的排序算法 二、常见排序算法的实现 2.1 插入排序 2.2 希尔排序 2.3 选择排序 2.4 堆排序 2.5 冒泡排序 2.6 快速排序 2.6.1 hoare版本 2.6.2 前后指针版本 2.6.3 非递归版本 2.7 归并排序 归并排序 2.8 计数排序 三、…

5G图标显示分析

1、问题现象 MTK平台项目中出现一个5G图标显示问题&#xff0c;注册5G时&#xff0c;拨打电话&#xff0c;对比机图标显示回落到4G&#xff0c;测试机一直显示5G。 2、原因分析 2.1、NSA显示规则 根据GSMA协议&#xff0c;NSA架构下5G图标显示有如下4种. 2.2、Android中显示5G…

Idea报错:无法访问org.springframework.boot.SpringApplication

在开发项目时&#xff0c;常常会遇到这种问题&#xff0c;报错信息如下图所示 版本号与jdk版本号存在对应关系&#xff0c;61.0对应jdk17&#xff0c;52.0对应jdk8 所以是某个依赖的版本太高&#xff0c;降低该依赖的版本即可 具体步骤&#xff1a; ①修改pom.xml中spring b…

16册 | 移动机器人(自动驾驶)系列

此文档整理推荐了16本移动机器人&#xff08;自动驾驶&#xff09;相关的书籍&#xff0c;内容包括&#xff1a;ROS、机器人基础开发、分布式机器人控制、集群机器人控制、嵌入式机器人、多传感器融合等等。 学习&#xff0c;切勿急于求成&#xff0c;读书自学&#xff0c;需多…

⑥ - 后端工程师通识指南

&#x1f4d6; 该文隶属 程序员&#xff1a;职场关键角色通识宝典 ✍️ 作者&#xff1a;哈哥撩编程&#xff08;视频号同名&#xff09; 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏…

基于STM32单片机的心率、血氧、温度检测系统设计与实现

基于STM32单片机的心率、血氧、温度检测系统设计与实现 摘要&#xff1a;本文主要设计并实现了一个基于STM32单片机的心率、血氧和温度检测系统。该系统使用MAX30102传感器采集心率和血氧浓度&#xff0c;LMT70传感器用于温度检测&#xff0c;同时通过OLED显示屏展示实时数据。…

[BT]BUUCTF刷题第25天(4.28)

第25天&#xff08;共3题&#xff09; Web [CISCN 2019 初赛]Love Math 打开网站就是一段泄露的源代码&#xff1a; <?php error_reporting(0); //听说你很喜欢数学&#xff0c;不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c…

使用 xe2 调整 3dTileset 模型位置并获取模型矩阵 modelMatrix

使用 xe2 调整 3dTileset 模型位置并获取模型矩阵 modelMatrix Demo 获取改变后的模型的 modelMatrix src\examples\tile\edit\offset\index.html 目录下&#xff0c;设置 3dTileset 地址&#xff0c;拖动模型&#xff0c;监听 modelMatrix 变化。

Linux(Centos 7)环境下安装wget,并且更换阿里云镜像

Linux(Centos 7) Minimal 安装后&#xff0c;由于没有预装wget&#xff0c;在使用wget命令去下载安装相关应用时&#xff0c;提示&#xff1a;“wget: command not found” 先在Linux服务器窗口中&#xff0c;输入如下命令&#xff0c;检查Linux服务器有没有安装过wget。 rpm -…