File tree Expand file tree Collapse file tree 2 files changed +103
-0
lines changed Expand file tree Collapse file tree 2 files changed +103
-0
lines changed Original file line number Diff line number Diff line change
1
+ #问题
2
+
3
+ 费波那契数列(意大利语:Successione di Fibonacci),又译费波拿契数、斐波那契数列、斐波那契数列、黄金分割数列。
4
+
5
+ 在数学上,费波那契数列是以递归的方法来定义:
6
+
7
+ F0 = 0 (n=0)
8
+ F1 = 1 (n=1)
9
+ Fn = F[n-1]+ F[n-2](n=>2)
10
+
11
+ 关于Fibonacci的精彩解释,请看下列视频:
12
+
13
+ [ TED-神奇的斐波那契数列] ( http://swf.ws.126.net/openplayer/v02/-0-2_M9HKRT25D_M9HNA0UNO-vimg1_ws_126_net//image/snapshot_movie/2014/1/6/L/M9HNA8H6L-.swf )
14
+
15
+ 如果要查看文字解释,请看维基百科词条:[ 斐波那契数列] ( http://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97 )
16
+
17
+ #思路说明
18
+
19
+ 几乎所有的高级语言都要拿Fibonacci数列为例子,解释递归、循环等概念。这里,我要用Python来演示一下,各种不同的写法,供参考。
20
+
21
+ #解决(python)
22
+
23
+ ##递归——按照定义直接写
24
+
25
+ 这种方法不是一个好方法,因为它的开销太大,比如计算fib1(100),就需要耐心等待较长一段时间了。所以,这是一种不实用的方法。但是,因为简单,列为第一种。
26
+
27
+ def fib1(n):
28
+ if n==0:
29
+ return 0
30
+ elif n==1:
31
+ return 1
32
+ else:
33
+ return fib1(n-1) + fib1(n-2)
34
+
35
+ ##递归,进行初始化
36
+
37
+ fib1的慢,就是因为每次都要计算前面已经算过的项目.这里将上述算法进行稍微改进。速度快了很多。
38
+
39
+ memo = {0:0, 1:1}
40
+ def fib2(n):
41
+ if not n in memo:
42
+ memo[n] = fib2(n-1)+fib2(n-2)
43
+ return memo[n]
44
+
45
+ ##迭代
46
+
47
+ def fib3(n):
48
+ a, b = 0, 1
49
+ for i in range(n):
50
+ a, b = b, a+b
51
+ return a
52
+
53
+ #直接理论数学结论
54
+
55
+ 在http://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97里面,已经列出了不同形式的Fibonacci数列的数学结果,可以直接将这些结果拿过来,通过程序计算,得到斐波那契数。此类程序,本文略。
56
+
Original file line number Diff line number Diff line change
1
+ #! /usr/bin/env python
2
+ #coding:utf-8
3
+
4
+ """
5
+ Fibonacci数列定义:
6
+
7
+ F0 = 0 (n=0)
8
+ F1 = 1 (n=1)
9
+ Fn = F[n-1]+ F[n-2](n=>2)
10
+
11
+ """
12
+
13
+ #递归,根据定义直接写
14
+ #这种方法不是一个好方法,因为它的开销太大,比如计算fib1(100),就需要耐心等待较长一段时间了。
15
+
16
+ def fib1 (n ):
17
+ if n == 0 :
18
+ return 0
19
+ elif n == 1 :
20
+ return 1
21
+ else :
22
+ return fib1 (n - 1 ) + fib1 (n - 2 )
23
+
24
+
25
+ #递归,进行初始化
26
+ #fib1的慢,就是因为每次都要计算前面已经算过的项目.这里将上述算法进行稍微改进。
27
+
28
+ memo = {0 :0 , 1 :1 }
29
+ def fib2 (n ):
30
+ if not n in memo :
31
+ memo [n ] = fib2 (n - 1 )+ fib2 (n - 2 )
32
+ return memo [n ]
33
+
34
+ #迭代
35
+
36
+ def fib3 (n ):
37
+ a , b = 0 , 1
38
+ for i in range (n ):
39
+ a , b = b , a + b
40
+ return a
41
+
42
+ #除了上述方法之外,还可以直接用数学运算的结果
43
+ #推荐参考:http://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97中的结论
44
+
45
+ if __name__ == "__main__" :
46
+
47
+ print fib21 (8 )
You can’t perform that action at this time.
0 commit comments