C#完美实现斐波那契数列
/// <summary>
/// Use recursive method to implement Fibonacci
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
static int Fn(int n)
{
if (n <= 0)
{
throw new ArgumentOutOfRangeException();
} if (n == 1||n==2)
{
return 1;
}
return checked(Fn(n - 1) + Fn(n - 2)); // when n>46 memory will overflow
}
递归算法时间复杂度是O(n2), 空间复杂度也很高的。当然不是最优的。
自然我们想到了非递归算法了。
一般的实现如下:
/// <summary>
/// Use three variables to implement Fibonacci
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
static int Fn1(int n)
{
if (n <= 0)
{
throw new ArgumentOutOfRangeException();
} int a = 1;
int b = 1;
int c = 1; for (int i = 3; i <= n; i++)
{
c = checked(a + b); // when n>46 memory will overflow
a = b;
b = c;
}
return c;
}
这里算法复杂度为之前的1/n了,比较不错哦。但是还有可以改进的地方,我们可以用两个局部变量来完成,看下吧:
/// <summary>
/// Use less variables to implement Fibonacci
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
static int Fn2(int n)
{
if (n <= 0)
{
throw new ArgumentOutOfRangeException();
} int a = 1;
int b = 1; for (int i = 3; i <= n; i++)
{
b = checked(a + b); // when n>46 memory will overflow
a = b - a;
}
return b;
}
好了,这里应该是最优的方法了。
值得注意的是,我们要考虑内存泄漏问题,因为我们用int类型来保存Fibonacci的结果,所以n不能大于46(32位操作系统)
C#完美实现斐波那契数列的更多相关文章
- P3986 斐波那契数列
题目描述 定义一个数列: f(0)=a,f(1)=b,f(n)=f(n−1)+f(n−2) 其中 a,b均为正整数,n≥2 . 问有多少种 (a,b),使得 k 出现在这个数列里,且不是前两项. 由于 ...
- C#求斐波那契数列第30项的值(递归和非递归)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
- js中的斐波那契数列法
//斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...
- 剑指Offer面试题:8.斐波那契数列
一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...
- 算法: 斐波那契数列C/C++实现
斐波那契数列: 1,1,2,3,5,8,13,21,34,.... //求斐波那契数列第n项的值 //1,1,2,3,5,8,13,21,34... //1.递归: //缺点:当n过大时,递归 ...
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...
- Python递归及斐波那契数列
递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可 ...
- 简单Java算法程序实现!斐波那契数列函数~
java编程基础--斐波那契数列 问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路:可能出现的情况:(1) n=1 ,一种方法 ;(2)n=2 ...
随机推荐
- Spring中的ApplicationContext事件机制
ApplicationContext的事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListerner接口来实现. 1. 创建EmailEvent pu ...
- Eplan PPE Pro-panel Electric fluid P8 2.4图文安装教程
Eplan ppe pro-panel electric fluid P8等多个最新2.4中文版本的安装,都是使用相同的虚拟驱动MultiKey,还是只有win32位的安装包,不过支持64位操作系统的 ...
- coderforces719b
题目大意:给定一个字符串,这个字符串中只有“r”和"b"组成,每次操作只能交换两个字符的位置或者将一个字符由"r"变"b"(或由" ...
- 小调网 经典电影 豆瓣评分 tampermonkey脚本
// ==UserScript== // @name 小调网 // @namespace http://tampermonkey.net/ // @version 0.1 // @descriptio ...
- Angular SEO方案
1.如果是java web项目,可以直接使用AngularSEO Filter. 官网地址 :http://www.angularseo.net/#about <filter> <f ...
- Notice: Trying to get property of non-object problem(PHP)解决办法 中间件只能跳转不能返任何数据
这里实际是调用了一个zend的数据库访问的方法,使用了fetchAll方法,但由于数据库中没有该记录,所以返回的对象是null,所以我就判断对象是否为null: 复制代码代码如下: if($obj== ...
- 慕客网laravel学习笔记
session中set方法使用 Session::set('user.username.age','18')嵌套使用得出$user = ['username'=>['age'=>18]]; ...
- 为什么在注册和注销的时候intent要改成隐式调用
显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件. 隐式意图: ...
- SeedDms 文档管理系统安装
在xampp下安装SeedDms 1.下载seeddms-quickstart-4.3.24.tar.gz,解压出来三个目录 \data\ \pear\ \seeddms-4.3.24\ 我把seed ...
- iOS开发~CocoaPods使用详细说明【转】
一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三方库. 二.安装 由于 ...