【算法】还在用递归实现斐波那契数组,面试官一定会鄙视你到死

我记得在初学C语言的时候,大学老师经常会讲一些常见的数学问题及递归的使用,其中斐波那契数组的实现就是一定会被拿出来举例的。在后来工作中,面试做面试题的时候,也很大概率会出现编程实现斐波那契额数组算法。可以说,在我们编程道路上,编写程序实现斐波那契数组算法是每个程序员必定会做的一件事。

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........我们会发现其中的规律,第一项和第二项的值均为1,后面每项的值都是前两项值之和,所以我们很多人基本上都会使用递归来实现,常见的算法如下:

1 public int fib(int n) {
2     if (n == 1 || n == 2) {
3         return 1;
4     }
5     return fib(n - 2) + fib(n - 1);
6 }

这段代码看起来非常的简洁和优雅,在此之前笔者也一直都是这么写的,而且在我的知识储备中也就只知道有这样一种算法。

昨天去参加腾讯课堂举办的一个线下活动,就讲到了这个问题,笔者也算是涨了姿势了。活动中有一位嘉宾,是某课堂的创始人,也是算法课程的讲师,就讲到了这个问题。本文就根据这名讲师的讲解,来分析和整理一下该问题算法的实现。

原文地址:https://www.cnblogs.com/andy-songwei/p/11706775.html

时间: 2024-08-02 09:31:59

【算法】还在用递归实现斐波那契数组,面试官一定会鄙视你到死的相关文章

还在用递归实现斐波那契数列,面试官一定会鄙视你到死

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368...... 我记得在初学C语言的时候,大学老师经常会讲一些常见的数学问题及递归的使用,其中斐波那契数列就是一定会被拿出来举例的.在后来工作中,面试做面试题的时候,也很大概率会出现编写算法实现斐波那契额数列求值.可以说,在我们编程道路上,编写算法实现斐波那契数列是

谨慎地使用递归之斐波那契递归实现的分析

[斐波那契函数的定义] 斐波那契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=1,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*). [用递归求解斐波那契函数的弊端] 斐波那契函数用递归实现如下面的代码: 计算斐波那契的自然递归程序效率时很低的,上面的程序虽然写法简单,看上去时递归的聪明的使用,但其实效率是及其低下的.特别是当n=40以后,效率衰减的特别明显.为了计算 fib( n ) ,

算法导论第十九章 斐波那契堆

<算法导论>第二版中在讨论斐波那契堆之前还讨论了二项堆,但是第三版中已经把这块的内容放到思考题中,究极原因我想大概是二项堆只是个引子,目的是为了引出斐波那契堆,便于理解,而且许多经典的算法实现都是基于斐波那契堆,譬如计算最小生成树问题和寻找单源最短路径问题等,此时再把二项堆单独作为一章来讲显然没有必要.类似的堆结构还有很多,如左倾堆,斜堆,二项堆等,下次我打算开一篇博客来记录下它们的异同点. 一.摊还分析(第十七章) 这些高级的数据结构的性能分析一般是基于一个技术——摊还分析,可以理解成一种时

几年前做家教写的C教程(之三专讲了递归和斐波那契)

C语言学习宝典(3) 数组: 一维数组的定义: 类型说明符  数组名[常量表达式] 例如: int  a[10]; 说明:(1)数组名的命名规则和变量名相同,遵循标示符命名规则 (2)在定义数组时需要指定数组个数,即数组长度 (3)变量表达式中可以包括常量和符号常量,不能包含变量. 一维数组的应用:  数组名[下标] 一维数组的初始化:(1)在定义数组时对数组元素赋予初值 Int a[10]={0,1,2,3,4,5,6,7,8,9} (2)可以只给一部分元素赋值 Int a[10]={0,1,

13、蛤蟆的数据结构笔记之十三栈的应用之栈与递归之斐波那契数列

13.蛤蟆的数据结构笔记之十三栈的应用之栈与递归之斐波那契数列 本篇名言:"人生不是一支短短的蜡烛,而是一支由我们暂时拿着的火炬,我们一定要把它燃得." 继续递归的斐波那契数列问题. 欢迎转载,转载请标明出处: 1.  斐波那契数列 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理.准晶体结构.化学

249 递归:概念,利用递归求1~n的阶乘,利用递归求斐波那契数列,利用递归遍历数据

6.1什么是递归 递归:如果一个函数在内部可以调用其本身,那么这个函数就是递归函数. 简单理解: 函数内部自己调用自己, 这个函数就是递归函数 注意:递归函数的作用和循环效果一样,由于递归很容易发生"栈溢出"错误(stack overflow),所以必须要加退出条件return. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"&g

递归之斐波那契数列

在数学上,費波那契數列是以递归的方法來定义: (n≧2) 用文字來说,就是斐波那契数列由0和1开始,之後的斐波那契数列就由之前的兩数相加. 这也是从维基百科上摘来的表述,比较的专业点.那个简单的写一下前面的几个是: 0,1,1,2,3,5,8,13,21,34,55,89,144,233...... 这个也是成一个指数增长的现象,所以兔子要是都按这个节奏生长,那就天天有肉吃了,还便宜!!! 这个问题相对与汉诺塔问题,较我而且,斐波那契数列一目了然,比较的好理解. 下面就用Ptyhon来实现一下:

递归求斐波那契数列

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.Write("输入想求的斐波那契数列项数:"); int n = Conver

C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈

递归是一种强有力的技巧,但和其他技巧一样,它也可能被误用. 一般需要递归解决的问题有两个特点: 存在限制条件,当符合这个条件时递归便不再继续: 每次递归调用之后越来越接近这个限制条件. 递归使用最常见的一个例子就是求阶乘,具体描述和代码请看这里:C语言递归和迭代法求阶乘 但是,递归函数调用将涉及一些运行时开销--参数必须压到堆栈中,为局部变量分配内存空间(所有递归均如此,并非特指求阶乘这个例子),寄存器的值必须保存等.当递归函数的每次调用返回时,上述这些操作必须还原,恢复成原来的样子.所以, 基