斐波那契数列( Fibonacci Sequence ),又称为黄金分割数列。在数学上,斐波那契数列是以递归的方法来定义:
F0 = 0
F1 = 1
Fn = Fn - 1 + Fn - 2
用文字来说,就是斐波那契数列由 0 和 1 开始,之后的斐波那契数就由之前的两数相加。首几个斐波那契数是: 0 , 1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , 144 , 233 , 377 , 610 , 987 , 1597 , 2584 , 4181 , 6765 , 10946 , ………………
特别指出: 0 不是第一项,而是第零项。
源起
根据高德纳( Donald Ervin Knuth )的《计算机程序设计艺术》( The Art of Computer Programming ), 1150 年印度数学家 Gopala 和金月在研究箱子包装物件长阔刚好为 1 和 2 的可行方法数目时,首先描述这个数列。 在西方,最先研究这个数列的人是比萨的列奥那多(又名费波那西),他描述兔子生长的数目时用上了这数列。
第一个月有一对刚诞生的兔子
第二个月之后它们可以生育
每月每对可生育的兔子会诞生下一对新兔子
兔子永不死去
假设在 n 月有新生及可生育的兔子总共 a 对, n+1 月就总共有 b 对。在 n+2 月必定总共有 a+b 对: 因为在 n+2 月的时候,所有在 n 月就已存在的 a 对兔子皆已可以生育并诞下 a 对后代;同时在前一月 (n+1 月 ) 之 b 对兔子中,在当月属于新诞生的兔子尚不能生育。
计算并显示前 20 个 Fibonacci 数
实现思路
1. 定义变量 c 表示当前的 Fibonacci 数, b 表示前一个 Fibonacci 数, a 表示前两个 Fibonacci 数。
2. 求出当前的 Fibonacci 数,即 c 的值 – c = b + a 。
3. 为了继续求下一个 Fibonacci 数,需要修改 b 和 a 的值,即 a = b ; b = c 。
实现步骤
// TwentyFibonacci.cs
using System;
public class TwentyFibonacci{
public static void Main(){
int a = 1, b = 1, c;
Console.Write(a + "/t" + b);
for(int i = 1; i <= 18; i++){
c = a + b;
Console.Write("/t" + c);
a = b;
b = c;
}
Console.WriteLine();
}
}
反费波那西数列
反费波那西数列的递归公式: Gn + 2 = Gn ? Gn + 1
如果它以 1 , -1 ,之后的数是: 1 , -1 , 2 , -3 , 5 , -8 , ...
即是 F2n + 1 = G2n + 1 ,F2n = ? G2n 。
显示前 20 个反 Fibonacci 数的程序
实现思路
4. 定义变量 c 表示当前的反 Fibonacci 数, b 表示前一个反 Fibonacci 数, a 表示前两个反 Fibonacci 数。
5. 求出当前的 Fibonacci 数,即 c 的值 – c = a - b 。
6. 为了继续求下一个 Fibonacci 数,需要修改 b 和 a 的值,即 a = b ; b = c 。
实现步骤
// TwentyAntiFibonacci.cs
using System;
public class TwentyAntiFibonacci {
public static void Main(){
int a = 1, b = -1, c;
Console.Write(a + "/t" + b);
for(int i = 1; i <= 18; i++){
c = a - b;
Console.Write("/t" + c);
a = b;
b = c;
}
Console.WriteLine();
}
}