题目描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39

解题思路

递推公式f(n)=f(n)=
当n=0=0,当n=0 当
n=1=1,当n=1
其他=f(n−1)+f(n−2)看到这大家很容易想起递归,课堂上老师讲递归的时候的经典例子。但是当n很大的时候,就会出现堆栈溢出。堆栈溢出的主要原因是,递归重复的计算太多,很多计算是可以避免的,用循环计算结果,显根据前两项算出第三项,以后每次都是这样计算。

代码实现

递归实现

        public static int Fibonacci(int n) {if (n <= 1) return n;return Fibonacci(n - 1) + Fibonacci(n - 2);}

循环实现

        public static int Fibonacci2(int n){if (n <= 1) return n;int first = 0;int second = 1;int result = 0;for (int i = 2; i <= n; i++){result = first + second;first = second;second = result;}return result;}

斐波那契数列求和

        public static int FibonacciSum(int n) {if (n <= 1) return n;int first = 0;int second = 1;int temp = 0;int result = first + second;for (int i = 2; i <= n; i++) {temp = first + second;first = second;second = temp;result = result + temp;}return result;}

斐波那契数列求和,利用公式计算

        public static int FibonacciSum2(int n){if (n <= 1) return n;int first = 0;int second = 1;int temp = 0;for (int i = 2; i <= n; i++){temp = first + second;first = second;second = temp;}int result = 2 * second + first - 1; //Sn = 2an + an - 1 - 1return result;}

测试

        [Fact]public void Test0(){Assert.Equal(0, Coding007.Fibonacci(0));Assert.Equal(0, Coding007.Fibonacci2(0));Assert.Equal(0, Coding007.FibonacciSum(0));Assert.Equal(0, Coding007.FibonacciSum2(0));}[Fact]public void Test1(){Assert.Equal(1, Coding007.Fibonacci(1));Assert.Equal(1, Coding007.Fibonacci2(1));Assert.Equal(1, Coding007.FibonacciSum(1));Assert.Equal(1, Coding007.FibonacciSum2(1));}[Fact]public void Test2(){Assert.Equal(1, Coding007.Fibonacci(2));Assert.Equal(1, Coding007.Fibonacci2(2));Assert.Equal(2, Coding007.FibonacciSum(2));Assert.Equal(2, Coding007.FibonacciSum2(2));}[Fact]public void Test3(){Assert.Equal(2, Coding007.Fibonacci(3));Assert.Equal(2, Coding007.Fibonacci2(3));Assert.Equal(4, Coding007.FibonacciSum(3));Assert.Equal(4, Coding007.FibonacciSum2(3));}[Fact]public void Test4(){Assert.Equal(3, Coding007.Fibonacci(4));Assert.Equal(3, Coding007.Fibonacci2(4));Assert.Equal(7, Coding007.FibonacciSum(4));Assert.Equal(7, Coding007.FibonacciSum2(4));}[Fact]public void Test5(){Assert.Equal(5, Coding007.Fibonacci(5));Assert.Equal(5, Coding007.Fibonacci2(5));Assert.Equal(12, Coding007.FibonacciSum(5));Assert.Equal(12, Coding007.FibonacciSum2(5));}[Fact]public void Test6(){Assert.Equal(8, Coding007.Fibonacci(6));Assert.Equal(8, Coding007.Fibonacci2(6));Assert.Equal(20, Coding007.FibonacciSum(6));Assert.Equal(20, Coding007.FibonacciSum2(6));}

View Code

想入非非:扩展思维,发挥想象

1. 熟悉递归
2. 熟悉斐波那契数列
3. 斐波那契数列求和
4. 知道有公式的就用公式,不要自己去循环就算,就像1+2+3+......,用高斯定理直接算结果,不要再循环了

转载于:https://www.cnblogs.com/zhao123/p/11158187.html

递归和循环:斐波那契数列相关推荐

  1. 用递归法计算斐波那契数列的第n项

     斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1, ...

  2. python 递归方式实现斐波那契数列

    python 递归方式实现斐波那契数列 import time t1=time.time() def factorial(n):if n==1 or n==2:return 1else:return ...

  3. python装饰器模式带参数_Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)...

    Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): ...

  4. C语言递归算法求斐波那契,递归法求斐波那契数列(C语言版)

    斐波那契数列: 又称黄金分割数列,指的是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 在数学上,斐波纳契数列以如下被以递归的方法定义 ...

  5. 循环斐波那契数列_剑指offer #10 斐波那契数列

    (递归和循环)#10 斐波那契数列 一.斐波那契数列 定义: n = 0 , f(n) = 0 n = 1 , f(n) = 1 n > 1 , f(n) = f(n-1) + f(n-2) 思 ...

  6. 循环斐波那契数列_每日一课 | 斐波那契数列的第n个项

    Python程序借助两种方法来计算斐波那契数列的第n个项 (有许多方法可以计算第n个项). 描述: 第一种方法:动态编程 在这种方法中,我们计算出斐波那契数列直到n的所有项,如果我们需要计算小于n的任 ...

  7. 递归与分治——斐波那契数列非递归,递归,与优化后的递归算法

    斐波那契数列: 1.1.2.3.5.8.13.21.-- 简单说,就是前两项的和是第三项的值. 1.求第N个斐波那契数的值(非递归) //斐波那契数列 int fun(int n) {int a = ...

  8. 递归 和 迭代 斐波那契数列

    #include "stdio.h"int Fbi(int i) /* 斐波那契的递归函数 */ { if( i < 2 ) return i == 0 ? 0 : 1; r ...

  9. 递归——阶乘加斐波那契数列(简单掌握递归思想的敲门砖)

    话不多说,先上源码: 阶乘: #include<iostream> #include<bits/stdc++.h> using namespace std;int JieChe ...

最新文章

  1. 软件测试人员必备Linux命令(初、中、高级)
  2. 目标跟踪算法五:MDNet: Learning Multi-Domain Convolutional Neural Networks for Visual Tracking
  3. 从今天开始,学习Webpack,减少对脚手架的依赖(下)
  4. 慕课网初识python_初识Python笔记
  5. git的一些常用命令讲解和开发规范总结
  6. sigmastarSSD201/SSD202 github上开源了!
  7. ESD二极管 DW12P4N3-S 电压12V 封装DFN2020-3L
  8. 前端学习(1385):多人管理项目5抽离
  9. matlab与maple互联,Matlab,Maple和Mathematica三款主流科学计算软件的互操作
  10. ABAP操作Excel(转)
  11. 2012年8月20日 我单身了!
  12. 密码分析学中常见的攻击模式
  13. js 设置焦点 判断控件是否获得焦点 判断哪个控件获得焦点
  14. 蓝牙HID——将android设备变成蓝牙鼠标/触控板(BluetoothHidDevice)
  15. 怎么看自己电脑MySQL版本_如何查看自己电脑sqlserver数据库版本
  16. 【JS教程】移动端 Touch(触摸)事件
  17. 数字孪生数字汽车风洞技术研究案例
  18. kmeans以及kmeans++聚类生成anchors
  19. Python爱因斯坦阶梯问题
  20. onMeasure(int widthMeasureSpec, int heightMeasureSpec)

热门文章

  1. find命令以及管道的简单使用技巧
  2. 涉及的一些操作的命令
  3. 利用dom4j取出XML文件中的数据
  4. Struts2+Spring详解
  5. Linux下网络编程
  6. go中 -strconv包的使用
  7. Docker mongodb Dockerfile ubuntu
  8. 搭建 LNMP 环境
  9. XFS:大数据环境下Linux文件系统的未来
  10. 函数声明和变量声明提升