斐波那契数列算法

本文对比了不同斐波那契数列算法的优劣,包括递归法及数组实现方式,并对递归算法进行了优化,显著提高了计算效率。

首先介绍一下什么是斐波那契数列:1,1,2,3,5,8,13,21…… ,可以看到这里面的规律吧.就是每一项是前面相邻两项之和.
网上有很多的这样的算法来计算第n位的值,我再次只是想比较一下他们的优劣来提供一下参考.
先介绍递归法吧,因为我发现好多面试题里面都提到要用递归法来实现.
为了考虑知识层次的不同,我先来帮大家查一下什么是递归,百度知识里面是这样定义的:
程序调用自身的编程技巧称为递归( recursion)。
一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策 略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出 的程序往往十分简洁易懂。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
注意:
(1) 递归就是在过程或函数里调用自身;
(2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
看一个最普遍的用法:
1        static int GetNumberAtPos(int pos)
2        {
3            if (pos == 0 || pos == 1)
4            {
5                return 1;
6             }
7            int res = GetNumberAtPos(pos - 1) + GetNumberAtPos(pos - 2);
8            return res;
9         }
此算法的算法复杂度相对的大,如果感兴趣的朋友可以运行一下它,让得到第100位的数值,你会发现运行了半天还是没有出来结果,我来分析一下具体的原 因.pos100=pos99+pos98,接着我们分别计算pos99=pos98+pos97和pos98=pos97+pos96,不知道您发现了 没有,这里的pos98会在接下来的计算2次,而pos97会被计算3次,看个图理解一下吧


 
大家试想一下这个算法复杂度,指数倍增吧!
我们做个改良吧
1        static Int64 GetNumberAtPos(int pos)
2        {
3            return GetNumberAtPos(1, 1, 3, pos);
4         }
5        static Int64 GetNumberAtPos(Int64 fist, Int64 second, int num, int pos)
6        {
7             Int64 third = fist + second;
8            if (num < pos)
9            {
10                 Int64 next = GetNumberAtPos(second, third, ++num, pos);
11
12             }
13            else
14            {
15                 Console.WriteLine(third.ToString());
16             }
17            return third;
18
19         }
这个也算是递归,也同样满足递归的定义,就是看起来难看点,不过运行速度上已经是明显的提升了,结果3736710778780434371, 的确这个数字不小.

当然我们也可以不用递归啊.
用数组来实现也是不错的,当然经过我测试,这个也是速度最快的.
1        static void GetNumberAtListPos(int pos)
2        {
3             Int64[] list = new Int64[pos];
4             list[0] = 1;
5             list[1] = 1;
6            for (int i = 2; i < pos; i++)
7            {
8                 list[i] = list[i - 1] + list[i - 2];
9             }
10
11             Console.WriteLine(list[pos-1].ToString());
12         }

 

<think>我们正在处理一个关于如何切换到vue-devtools项目的特定标签(tag)或分支的问题。用户已经知道需要切换到v5.1.0 tag或者master分支,但不知道具体如何操作。 步骤: 1. 首先,我们需要确保已经克隆了vue-devtools的仓库到本地。如果没有,需要先克隆。 2. 使用git命令切换到特定的tag分支。 具体操作: ### 1. 克隆仓库(如果尚未克隆) 如果你还没有克隆vue-devtools的仓库,请先执行: ```bash git clone https://github.com/vuejs/vue-devtools.git cd vue-devtools ``` ### 2. 查看可用的标签(tag)和分支 - 查看所有标签: ```bash git tag ``` 这会列出所有可用的标签。我们需要的标签是`v5.1.0`(如果有的话,注意标签命名可能略有不同,比如`v5.1.0`或`5.1.0`,但通常以v开头)。 - 查看所有分支: ```bash git branch -a ``` 这会列出本地和远程的分支。其中,`master`分支是主分支(注意:现在很多项目将默认分支改为`main`,但vue-devtools项目仍然使用`master`)。 ### 3. 切换到标签(tag) 标签是某个特定提交的标记,通常用于版本发布。切换到标签使用以下命令: ```bash git checkout tags/<tag_name> ``` 例如,切换到`v5.1.0`标签: ```bash git checkout tags/v5.1.0 ``` 注意:标签名要严格匹配。如果不确定,可以用`git tag`命令查看。 ### 4. 切换分支branch切换master分支(或其他分支): ```bash git checkout master ``` 或者,如果分支在远程,可能需要先创建本地分支并跟踪远程分支(通常克隆后已经有了远程分支的跟踪,可以直接切换): ```bash git checkout master ``` ### 5. 验证当前所在位置 使用以下命令查看当前所在的分支或标签状态: ```bash git status ``` 它会显示当前处于哪个分支或标签(注意,如果切换到标签,会处于“分离头指针”状态,这是正常的,因为标签指向一个固定的提交)。 ### 注意事项 - 切换分支或标签后,可能需要重新安装依赖(因为不同版本的依赖可能不同): ```bash npm install # 或者使用cnpm ``` 如果npm安装失败,可以尝试使用cnpm(需要先安装cnpm): ```bash cnpm install ``` - 如果之前已经安装过依赖,切换后最好删除`node_modules`目录重新安装,以避免依赖冲突。 ### 引用说明 根据用户提供的参考,切换到特定标签或分支可以解决安装依赖失败的问题[^1]。 §§相关问题§§ 1. 如何在不克隆整个仓库的情况下下载特定标签或分支代码? 2. 切换到标签后如何创建新分支进行修改? 3. 如何解决切换分支或标签后出现的依赖冲突问题? </think>要在 `vue-devtools` 项目中切换到特定的标签(tag)或分支,请按以下步骤操作: ### 1. 克隆项目(若尚未克隆) ```bash git clone https://github.com/vuejs/vue-devtools.git cd vue-devtools ``` ### 2. 查看可用标签和分支 ```bash # 查看所有标签 git tag -l # 查看所有分支 git branch -a ``` ### 3. 切换指定标签或分支 ```bash # 切换到 v5.1.0 标签 git checkout tags/v5.1.0 # 或者切换master 分支 git checkout master ``` ### 4. 验证切换结果 ```bash # 查看当前状态 git status # 确认当前指向的提交ID(标签会显示为 detached HEAD) git log -1 --oneline ``` ### 5. 安装依赖(切换后重要步骤) ```bash # 推荐使用 cnpm 避免网络问题 cnpm install # 或使用 npm(可能需要 sudo 权限) npm install ``` ### 注意事项 1. 标签本质是指向特定提交的静态指针,切换后处于 "detached HEAD" 状态(即不在任何分支上) 2. 若要基于标签修改代码,建议创建新分支: ```bash git checkout -b my-fix tags/v5.1.0 ``` 3. 首次克隆项目后,需获取远程标签信息: ```bash git fetch --tags ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值