面试题10:斐波那契数列

斐波那契数指的是这样一个数列:0、1、1、2、3、5、8、13、21、……

这个数列从第三个数开始,之后的每一个数都由它前的两数相加得到。

我们知道在编程中我们可以用递归和迭代两种方法求指定的斐波那契数,但这两种方法各有利弊。

区别:递归法(时间复杂度O(2^n))写出来的代码可读性强,就相当于把书上的数学公式 翻译成代码,但这种方法效率太慢了,当你求第50个斐波那契数,你的电脑可能得运算十多分钟。而且递归很容易造成栈溢出,每调用一次函数就得开辟一块空间,而求第50个斐波那契数所调用函数的次数是令人发指,同样的那在栈上开辟的空间大小也就可想而知,栈溢出就很正常了。

迭代法:(时间复杂度O(N))相对而言迭代法的运算效率就高的多了,迭代是通过循环来求的,只要创建3个临时变量,就能很快的求出斐波那契数,而且速度快的一匹(那怕求第100斐波那契数也只是一瞬间的事),但迭代法的代码可读性较弱,而且初学者也不容易写出这种代码。

---------------------

作者:Tianzez

来源:CSDN

原文:https://blog.csdn.net/tianzez/article/details/78443321

版权声明:本文为博主原创文章,转载请附上博文链接!

下面是代码:

  • 递归法
int Fab(int n){

      if(n == 0)
         return 0;
      if(n == 1)
         return 1;

      return Fab(n-1) + Fab(n-2);

}
  • 迭代法
long long Fibnacci(unsigned n){

    int result[2] = {0,1};
    if(n < 2)
        return result[n];

    long long fibNMinusOne = 0;
    long long fibNMinusTwo = 1;
    long long fibN = 0;
    for(int i = 2;i <= n;i++){
        fibN = fibNMinusOne + fibNMinusTwo;
        fibNMinusOne = fibNMinusTwo;
        fibNMinusTwo = fibN;

    }

}

原文地址:https://www.cnblogs.com/ovs98/p/9879702.html

时间: 2024-11-08 06:53:45

面试题10:斐波那契数列的相关文章

LeetCode | 面试题10- I. 斐波那契数列【剑指Offer】【Python】

LeetCode 面试题10- I. 斐波那契数列[剑指Offer][Easy][Python][动态规划] 问题 力扣 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出. 答案需要取模 1e9+7(1000000007),如计算初始结果为:10000000

剑指offer编程题Java实现——面试题9斐波那契数列

题目:写一个函数,输入n,求斐波那契数列的第n项. 1 package Solution; 2 3 /** 4 * 剑指offer面试题9:斐波那契数列 5 * 题目:写一个函数,输入n,求斐波那契数列的第n项. 6 * 0, n=1 7 * 斐波那契数列定义如下:f(n)= 1, n=2 8 * f(n-1)+f(n-2), n>2 9 * @author GL 10 * 11 */ 12 public class No9Fibonacci { 13 14 public static void

10 斐波那契数列

1 def fib_recur(n): 2 assert n >= 0 3 if n in (0, 1): 4 return n 5 return fib_recur(n - 1) + fib_recur(n - 2) 6 7 for i in range(20): 8 print(fib_recur(i), end=" ") 1 2)递推法 2 3 def fib_loop(n): 4 a, b = 0, 1 5 for i in range(n): 6 a, b = b, a

斐波那契数列——摘自搜狗百科

1数列公式 递推公式 斐波那契数列:0.1.1.2.3.5.8.13.21.34.55.89.144... 如果设F(n)为该数列的第n项(n∈N*),那么这句话可以写成如下形式: F(0) = 0,F(1)=F(2)=1,F(n)=F(n-1)+F(n-2) (n≥3) 通项公式 通项公式的推导方法一:利用特征方程 线性递推数列的特征方程为: X^2=X+1 解得 X1=(1+√5)/2, X2=(1-√5)/2. 斐波拉契数列则F(n)=C1*X1^n + C2*X2^n ∵F(1)=F(2

黑马入学基础测试(三)求斐波那契数列第n项,n&lt;30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55

.获得用户的输入 计算      3打印就行了.   这里用到了java.util.Scanner   具体API  我就觉得不常用.解决问题就ok了.注意的是:他们按照流体的方式读取.而不是刻意反复读取 自己写的代码: package com.itheima; import java.util.Scanner; public class Test3 { /** * 3.求斐波那契数列第n项,n<30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55 * * @author

剑指Offer面试题9(java版)斐波那契数列

题目一:写一个函数,输入n,求斐波那契数列的第n项.斐波那契数列的定义如下: 1.效率很低效的解法,挑剔的面试官不会喜欢 很多C语言的教科书在讲述递归函数的时候,都户拿Fibonacci作为例子,因此很多的应聘者对这道题的递归解法都很熟悉. 下面是实现代码 我们教科书上反复用这个问题来讲解递归的函数,并不能说明递归的解法最适合这道题目.面试官会提示我们上述递归的解法有很严重的效率问题要求我们分析原因. 我们以求解f(10)为例来分析递归的求解过程.想求得f(10),需要先求出f(9)和f(8).

关于斐波那契数列的一点规律 --14年蓝桥杯试题

问题描述 斐波那契数列大家都非常熟悉.它的定义是: f(x) = 1 .... (x=1,2) f(x) = f(x-1) + f(x-2) .... (x>2) 对于给定的整数 n 和 m,我们希望求出: f(1) + f(2) + ... + f(n) 的值.但这个值可能非常大,所以我们把它对 f(m) 取模. 公式如下 但这个数字依然很大,所以需要再对 p 求模. 输入格式 输入为一行用空格分开的整数 n m p (0 < n, m, p < 10^18) 输出格式 输出为1个整数

剑指offer(10)—— 斐波那契数列以及跳台阶问题

总结 2^(n-1)可以用位移操作进行: 1<< (n-1) 如果递归不好思考的话,可以找规律,代码很简单 斐波那契数列(10) 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 public class Solution { public int Fibonacci(int n) { // 先判断n必须在范围内取值 if(n > 39 && n <= 0) return 0; // 为1直接返

Python初学者笔记:打印出斐波那契数列的前10项

问题:斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*),用文字来说,就是斐波那契数列列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加.特别指出:0不是第一项,而是第零项. 方法:Python2.7.9 a=0 b=

求斐波那契数列第n项,n&lt;30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55

public class Test4 { public static void main(String[] args) { int n; int fn; Scanner scanner=new Scanner(System.in); System.err.println("请输入30以内的整数:"); n=scanner.nextInt(); fn=peibo(n); System.out.println("斐波那契数列第"+n+"项为:"+fn