Fibonacci series(斐波纳契数列)的几种常见实现方式
费波那契数列的定义:
费波那契数列(意大利语:Successione
di Fibonacci),又译费波拿契数、斐波那契数列、斐波那契数列、黄金切割数列。


(n≧2)
用文字来说,就是费波那契数列由0和1開始。之后的费波那契系数就由之前的两数相加。
首几个费波那契系数是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……
特别指出: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(斐波纳契数列)的几种常见实现方式的更多相关文章
- 10、end关键字和Fibonacci series: 斐波纳契数列
# Fibonacci series: 斐波纳契数列 # 两个元素的总和确定了下一个数 a, b = 0, 1 #复合赋值表达式,a,b同时赋值0和1 while b < 10: print(b ...
- 012_Python3 斐波纳契数列 + end 关键字
1.个斐波纳契数列. #!/usr/bin/python3 # Fibonacci series: 斐波纳契数列 # 两个元素的总和确定了下一个数 a, b = 0, 1 while b < ...
- Python3 编程第一步_斐波纳契数列_连续赋值
# Fibonacci series: 斐波纳契数列 # 两个元素的总和确定了下一个数 a, b = 0, 1 while b < 10: print(b) a, b = b, a+b # 1 ...
- lintcode:Fibonacci 斐波纳契数列
题目: 斐波纳契数列 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, ...
- 使用一位数组解决 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 ...
- 用PHP迭代器来实现一个斐波纳契数列(转)
斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解 ...
- 算法之路(三)----查找斐波纳契数列中第 N 个数
算法题目 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: * 前2个数是 0 和 1 . * 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1 ...
- 用PHP迭代器来实现一个斐波纳契数列
斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解 ...
- LintCode 斐波纳契数列
查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1, 1, 2, 3 ...
随机推荐
- Queue 队列的用法
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用. 以下实例演示了队 ...
- 想使用gevent、mysql、sqlalchemy实现python项目协程异步达到并发的效果
如题,但是查看了很多资料,都说python这边的mysql不支持异步并发,只能阻塞进行,心塞30秒,暂时放弃这方面的研究 如果不操作数据库的化,比如请求url.操作文件,还是可以用gevent来异步实 ...
- http://blog.csdn.net/tkwxty/article/details/34474501
http://blog.csdn.net/tkwxty/article/details/34474501
- [Python爬虫] 之十九:Selenium +phantomjs 利用 pyquery抓取超级TV网数据
一.介绍 本例子用Selenium +phantomjs爬取超级TV(http://www.chaojitv.com/news/index.html)的资讯信息,输入给定关键字抓取资讯信息. 给定关键 ...
- fastestmirror不能使用
fastestmirror不能使用,fastestmirror是yum的一个加速插件 处理办法就是禁用这个插件 方法两种 第一种 vi /etc/yum/pluginconf.d/fastestmir ...
- c++ 银行管理系统及报告
1.题目描写叙述: 本代码为银行管理系统,总体分为管理员模式和普通用户模式: (1)在管理员模式中能完毕 ①用户信息录入 ②改动管理员password ③改动指定账户信息 ④信息管理业务 (2)在普通 ...
- linux c中select使用技巧——计时器(转)
通过本文你会了解到: 1. select()原型及参数说明 2. select()应用情景 3. select()注意事项 4. select()作定时器 原型 int select(int nfds ...
- 【Java】Java_06 基本数据类型
1.基本数据类型 Java是一种强类型语言,每个变量都必须声明其类型. . Java的数据类型分为两大类:基本类型(primitive type)和引用类型 (reference type) ...
- 道具搜索框(|=, & , ^=)实现的列子
需求: 勾上界面上多选框筛选出符合的道具 思路: 1. 使用组合数字让一个数字包含多这个搜索条件,比如2代表搜索衣服和武器, 数字按照2的n次幂的值递增,通过|,&,^运算符实现一个数字包含多 ...
- Linux下使用Fastboot给手机刷ROM
前言 一直在刷机.失败.刷机.失败中,还好今天有个任务能够使用fastboot刷机.好开心,最终不用切换系统了.(话说好久没有写代码了,身为一个互联网程序猿,不写代码我easy紧张). 开发环境 Ub ...