ruby 斐波那契数列 怎么写

Python011

ruby 斐波那契数列 怎么写,第1张

斐波拉契数列的简介

斐波拉契数列(又译作“斐波那契数列”或“斐波那切数列”)是一个非常美丽、和谐的数列,它的形状可以用排成螺旋状的一系列正方形来说明(如右词条图),起始的正方形(图中用灰色表示)的边长为1,在它左边的那个正方形的边长也是1 ,在这两个正方形的上方再放一个正方形,其边长为2,以后顺次加上边长为3、5、8、13、2l……等等的正方形。这些数字每一个都等于前面两个数之和,它们正好构成了斐波那契数列。“斐波那契数列”的发明者,是意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci,生于公元1170年,卒于1240年。籍贯大概是比萨)。他被人称作“比萨的列昂纳多”。1202年,他撰写了《珠算原理》(Liber Abaci)一书。他是第一个研究了印度和阿拉伯数学理论的欧洲人。他的父亲被比萨的一家商业团体聘任为外交领事,派驻地点相当于今日的阿尔及利亚地区,列昂纳多因此得以在一个阿拉伯老师的指导下研究数学。他还曾在埃及、叙利亚、希腊、西西里和普罗旺斯研究数学。

斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34……

这个数列从第三项开始,每一项都等于前两项之和。它的通项公式为:(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n} (√5表示5的算术平方根) (19世纪法国数学家敏聂(Jacques Phillipe Marie Binet 1786-1856)

很有趣的是:这样一个完全是自然数的数列,通项公式居然是用无理数来表达的。

斐波拉契数列的出现

13世纪初,欧洲最好的数学家是斐波拉契;他写了一本叫做《算盘书》的著作,是当时欧洲最好的数学书。书中有许多有趣的数学题,其中最有趣的是下面这个题目:

“如果一对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月裏,又能开始生1对小兔子,假定在不发生死亡的情况下,由1对初生的兔子开始,1年后能繁殖成多少对兔子?”

斐波拉契把推算得到的头几个数摆成一串:1,1,2,3,5,8……

这串数里隐含着一个规律:从第3个数起,后面的每个数都是它前面那两个数的和。而根据这个规律,只要作一些简单的加法,就能推算出以后各个月兔子的数目了。

于是,按照这个规律推算出来的数,构成了数学史上一个有名的数列。大家都叫它“斐波拉契数列”,又称“兔子数列”。这个数列有许多奇特的的性质,例如,从第3个数起,每个数与它后面那个数的比值,都很接近于0.618,正好与大名鼎鼎的“黄金分割律”相吻合。人们还发现,连一些生物的生长规律,在某种假定下也可由这个数列来刻画呢。

斐氏本人对这个数列并没有再做进一步的探讨。直到十九世纪初才有人详加研究,1960年左右,许多数学家对斐波拉契数列和有关的现象非常感到兴趣,不但成立了斐氏学会,还创办了相关刊物,其后各种相关文章也像斐氏的兔子一样迅速地增加。

斐波拉契数列的来源及关系

斐波拉契(Fibonacci)数列来源于兔子问题,它有一个递推关系,

f(1)=1

f(2)=1

f(n)=f(n-1)+f(n-2),其中n>=2

{f(n)}即为斐波拉契数列。

斐波拉契数列的公式

它的通项公式为:{[(1+√5)/2]^n - [(1-√5)/2]^n }/√5 (注:√5表示根号5)

斐波拉契数列的某些性质

1),f(n)f(n)-f(n+1)f(n-1)=(-1)^n

2), f(1)+f(2)+f(3)+……+f(n)=f(n+2)-1

3),arctan[1/f(2n+1)]=arctan[1/f(2n+2)]+arctan[1/f(2n+3)]

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。

n<=39

        见到题目很自然联想到用递归或是用数组将前面的结果全部存储起来(这个想法其实和递归没区别),写起来最简单。但实际写出来发现不现实,运行效率太低,提交答案的时候果然提示超出要求时间,程序太过复杂。查阅答案的时候才发现一个很巧妙的方法(主要还是自己太笨了脑筋不会拐弯=.=||),其实F(n)=F(n-1)+F(n-2),也就是说整个运算过程其实只用保存两个数值即可计算出所需结果,并不需要保存前面的全部结果。2个数值,就应该联想到通过模2来存取数值(写到这里愈发觉得自己是个猪头),这样大大提高了效率,降低了存储空间。

        其次是在实现过程中要注意一个小问题,最开始本猪写的是 for i in range(2,n) ,后来发现答案全错了,原来是因为n=2时, range(2,2) 为0,并不会运算下面的值,所以需要多算一位。

# -*- coding:utf-8 -*-

class Solution:

    def __init__(self):

        self.temp_Array = [0,1]

    def Fibonacci(self, n):

        if type(n) != int or n <= 0:

            return False

        elif n == 1:

            return 1

        else:

            for i in range(2,n+1):

                self.temp_Array[i%2] = self.temp_Array[0]+self.temp_Array[1]

            return self.temp_Array[n%2]

斐波那契数列 ( 意大利语 :Successione di Fibonacci) 的定义

斐波那契数列由0和1开始,之后的每个斐波那契数就是由之前的两数相加而得出。具体数值如下:

0,1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610,..............

特别注意 :F(0)代表的是第一个数值,数列下标由0开始。

代码如上,用了迭代的算法计算每个数值,每个N值最大运行N-1次循环,算法比递归要高效很多。递归代码如下: