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