Skip to content

Commit b116d66

Browse files
committed
斐波那契数列多种实现方法
1 parent 7341b76 commit b116d66

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed

fibonacci.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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+

fibonacci.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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)

0 commit comments

Comments
 (0)