费波那契数列的定义:

费波那契数列意大利语:Successione
di Fibonacci),又译费波拿契数斐波那契数列斐波那契数列黄金切割数列

数学上,费波那契数列是以递归的方法来定义:

  • (n≧2)

用文字来说,就是费波那契数列由0和1開始。之后的费波那契系数就由之前的两数相加。

首几个费波那契系数是:01123581321345589144233……

特别指出0不是第一项。而是第零项。

以下是费波那契数列的几种常见编程实现:

1、常规实现:

int Fibonacci(int n)
{
int a = 1, b = 1;
if(n < 0)
{
printf("The fibonacci number exists only with nonnegative index.\n");
return -1;
}
else if (n == 0)
return 0;
else if(n==1 || n==2)
return 1;
else
{
for(int i=3; i<=n; i++)
{
int tmp = b;
b = a + b;
a = tmp;
}
return b;
}
}

2、递归实现:

int Fibonacci(int n)
{
if(n < 0)
printf("The fibonacci number exists only with nonnegative index.\n");
else
{
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}

3、迭代实现:

int Fibonacci_iter(int a, int b, int count)
{
if(count < 0)
printf("The fibonacci number exists only with nonnegative index.\n");
else if(count == 0)
return b;
else
return Fibonacci_iter(a + b, a, count - 1);
} int Fibonacci(int n)
{
return Fibonacci_iter(1, 0, n);
}

4、元编程实现:

#include<iostream>

using namespace std;

int Result;

//主模板
template<int N> //模板
class Fibonacci
{
public:
enum{Result = Fibonacci<N-1>::Result + Fibonacci<N-2>::Result }; //枚举。带有隐含计算
}; //全然特化模板
template<>
class Fibonacci<1> //带常參数1的构造函数
{
public:
enum { Result = 1 }; //给枚举赋初值1
}; //全然特化模板
template<>
class Fibonacci<0> //带參数0的模板
{
public:
enum { Result = 0 }; //给枚举赋初值0
}; int main()
{
std::cout << "第20项的Fibonacci数是:" << Fibonacci<20>::Result << std::endl; //隐含计算
system("pause");
return 1;
}

总结:

递归英语:Recursion)。又译为递回,在数学计算机科学中。是指在函数的定义中使用函数自身的方法。

迭代,数学中的迭代能够指函数迭代的过程。即重复地运用同一函数计算,前一次迭代得到的结果被用于作为下一次迭代的输入。

使用递归要注意的有两点:

1)递归就是在过程或函数里面调用自身;

2)在使用递归时,必须有一个明白的递归结束条件,称为递归出口.

递归分为两个阶段:

1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;

2)回归:当获得最简单的情况后,逐步返回,依次得到复杂的解.

迭代:利用变量的原值推算出变量的一个新值.假设递归是自己调用自己的话,迭代就是A不停的调用B.

递归中一定有迭代,可是迭代中不一定有递归,大部分能够相互转换.能用迭代的不用递归,递归调用函数,浪费空间,而且递归太深easy造成堆栈的溢出.

元编程(Metaprogramming)是指某类计算机程序的编写。这类计算机程序编写或者操纵其它程序(或者自身)作为它们的数据,或者在执行时完毕部分本应在编译时完毕的工作。非常多情况下比手工编写所有代码相比工作效率更高。编写元程序的语言称之为元语言。被操作的语言称之为目标语言。一门语言同一时候也是自身的元语言的能力称之为反射

參考文献:

费波那契数列:http://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97

迭代:http://zh.wikipedia.org/wiki/%E8%BF%AD%E4%BB%A3

递归:http://zh.wikipedia.org/wiki/%E9%80%92%E5%BD%92

递归与迭代的差别:http://blog.csdn.net/swliao/article/details/5337896

递归与迭代:http://blog.csdn.net/ljyf5593/article/details/5935795

关于fibonacci递归算法和迭代算法在C和Scheme下实现存在差距的疑惑:http://bbs.csdn.net/topics/190008464

Fibonacci series(斐波纳契数列)的几种常见实现方式的更多相关文章

  1. 10、end关键字和Fibonacci series: 斐波纳契数列

    # Fibonacci series: 斐波纳契数列 # 两个元素的总和确定了下一个数 a, b = 0, 1 #复合赋值表达式,a,b同时赋值0和1 while b < 10: print(b ...

  2. 012_Python3 斐波纳契数列 + end 关键字

    1.个斐波纳契数列. #!/usr/bin/python3   # Fibonacci series: 斐波纳契数列 # 两个元素的总和确定了下一个数 a, b = 0, 1 while b < ...

  3. Python3 编程第一步_斐波纳契数列_连续赋值

    # Fibonacci series: 斐波纳契数列 # 两个元素的总和确定了下一个数 a, b = 0, 1 while b < 10: print(b) a, b = b, a+b # 1 ...

  4. lintcode:Fibonacci 斐波纳契数列

    题目: 斐波纳契数列 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, ...

  5. 使用一位数组解决 1 1 2 3 5 8 13 数列问题 斐波纳契数列 Fibonacci

    斐波纳契数列 Fibonacci 输出这个数列的前20个数是什么? 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 使用数组实现输出数列的前30 ...

  6. 用PHP迭代器来实现一个斐波纳契数列(转)

    斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解 ...

  7. 算法之路(三)----查找斐波纳契数列中第 N 个数

    算法题目 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: * 前2个数是 0 和 1 . * 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1 ...

  8. 用PHP迭代器来实现一个斐波纳契数列

    斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解 ...

  9. LintCode 斐波纳契数列

    查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1, 1, 2, 3 ...

随机推荐

  1. redis基本命令,配置参数

    https://www.w3cschool.cn/redis/redis-pub-sub.html redis-server --maxclients 100000 客户端命令CLIENT LIST ...

  2. Less 简介

    什么是LESSCSS LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法,为CSS的赋予了动态语言的特性,如变量.继承.运算.函数等,更方便CSS的编写和维护. LE ...

  3. yii2 URL重写 nginx的配置

    Url的重写 nginx的配置文件 [root@localhost protected]# vim /etc/nginx/conf.d/default.conf server { listen     ...

  4. 第五章:关于ESearch的应用

    ElasticSearch是一个开源的分布式搜索引擎,具备高可靠性,支持非常多的企业级搜索用例. 我在这里做一下简单介绍和整理: 首先.ES搜索引擎给予java开放使用之前必须安装java环境,使用j ...

  5. Zookeeper的集群安装和配置

    zk服务器集群规模不小于3个节点,要求各服务器之间系统时间要保持一致. 在master节点的/home/hadoop目录下,解压缩zk....tar.gz,具体安装的路径自选 解压后重命名该文件夹为z ...

  6. struts2入门示例(hello world)

    1. 环境搭建 按照之前的文章配置好myeclipse的jdk和tomcat,并新建一个web项目后,可开始动手配置与struts2相关的地方了.首先去struts的官网下载好最新的struts2代码 ...

  7. 【Python3 爬虫】14_爬取淘宝上的手机图片

    现在我们想要使用爬虫爬取淘宝上的手机图片,那么该如何爬取呢?该做些什么准备工作呢? 首先,我们需要分析网页,先看看网页有哪些规律 打开淘宝网站http://www.taobao.com/ 我们可以看到 ...

  8. hibernate 继承映射关系( TABLE_PER_CLASS)

    Person,Student,Teacher各创建一个表,主键用一个中间表生成.   package com.bjsxt.hibernate; import javax.persistence.Ent ...

  9. (一)EasyUI 使用——基本概念

    1. EasyUI是什么 EasyUI是一种第三方组织开发的一款基于jQuery的,简单易用的,功能强大的WEB[后台前端]JavaScript现成的组件库. 2.  JavaScript,AJAX, ...

  10. Repository、IUnitOfWork 和 IDbContext

    1)领域层不应该直接依赖于仓储实现:如果领域层依赖于仓储实现,一是技术绑定太紧密,二是仓储要对领域对象作操作,会造成循环依赖. 2)将接口定义在领域层,减少技术架构依赖,应用层或领域层要使用某个仓储实 ...