python 实现斐波那契数列

2016-02-26 15:19:41 +08:00
 zangxixi
各位 pythoner 们,大家来分享用 python 实现斐波那契数列的不同做法吧!!~\(≧▽≦)/~
7938 次点击
所在节点    Python
59 条回复
florije
2016-02-26 15:31:29 +08:00
def fib(n):
a,b = 1,1
for i in range(n-1):
a,b = b,a+b
return a
print fib(5)
先来个最简单的吧~
MyLeoWind
2016-02-26 15:31:48 +08:00
a, b = b, a+b
这个确实是最简洁的。
kevinyoung
2016-02-26 15:34:01 +08:00
送分题不做
songkaiape
2016-02-26 15:39:40 +08:00
@kevinyoung 有一百个人,分别从 1 一直到 100 。现在有人拿枪从第一个开始枪毙,每枪毙一个跳过一个, 一直到一轮完成。接着在活着的人里面再次枪毙第一个,间隔一个再枪毙一个,请问最后活着的是这一百个人里的第几个人?给你个有难度的=。=
1373569162
2016-02-26 15:47:43 +08:00
俺贴个别人总结版的, 有兴趣的看下
http://www.cnblogs.com/figure9/archive/2010/08/30/1812927.html
还有一个求质数的有兴趣的可以实现一下
https://program-think.blogspot.com/2011/12/prime-algorithm-1.html
glchaos
2016-02-26 15:51:39 +08:00
@kevinyoung 不送分的题不会做,就是这么任性
random2case
2016-02-26 15:55:48 +08:00
俺喜欢斐波那契数列,先来一个 rust 写的
fn fibonacci (n:i32) ->i32{
if n<=2 {1} else {fibonacci(n-1)+fibonacci(n-2)}
}
再来一个 scala 写的
object test{
def fibonacci(n:Int):Int={
if (n<2) 1 else fibonacci(n-1)+fibonacci(n-2)
}
}
eote
2016-02-26 15:58:04 +08:00
```
import json
import urllib2
import lxml.etree

html = urllib2.urlopen('https://oeis.org/A000045/list').read()
pre = lxml.etree.HTML(html).xpath('//pre')
rst = json.loads(pre[0].text)

for i in rst:
print(str(i) + '\n')
```

输出前 38 个 Fib
jixiangqd
2016-02-26 16:01:44 +08:00
@songkaiape 这个貌似也没难度啊,直接按字面意思翻译成程序就能跑出结果?
a=[i+1 for i in range(100)]
while len(a)>1:
b=a[:]
for i in range(0,len(a),2):
a.remove(b[i])
print a
jixiangqd
2016-02-26 16:03:37 +08:00
重新贴一下程序
```python
a=[i+1 for i in range(100)]
while len(a)>1:
b=a[:]
for i in range(0,len(a),2):
a.remove(b[i])
print a
```
qiuhanyuan
2016-02-26 16:08:52 +08:00
def fibs(num):
result = [1, 1]
for i in range(num-2):
result.append(result[-1]+result[-2])
return result
Lihz
2016-02-26 16:19:15 +08:00
楼上的都不喜欢用 yield 构建生成器么?如果拿这做面试题,侧重的不在于能否给出答案,而是被面试者能否脑补出不同条件并构建对应方案以及在不同方案下暴露出的编程习惯吧
Lihz
2016-02-26 16:20:55 +08:00
类似的还有素数筛选这种看似简单,但深入而言可挖掘的点是非常多的
fulvaz
2016-02-26 16:25:59 +08:00
斐波那契数列很多结果都可以重复利用, 只需要加个缓存, 就能有非常棒的速度

: )
songkaiape
2016-02-26 16:29:03 +08:00
@jixiangqd 嗯,是不难啊,不过你为什么这样写 a=[i+1 for i in range(100)] ,直接 a=list(range(1,101))不就好了么
songkaiape
2016-02-26 16:30:38 +08:00
@jixiangqd
l=range(1,101)
while len(l)!=1:
l=l[1::2]
print(l[0])
更优雅的解法,当然其实本质上都一样=。=
livc
2016-02-26 16:30:38 +08:00
@songkaiape 约瑟夫环
jixiangqd
2016-02-26 16:32:08 +08:00
@songkaiape 这倒是,- -,随手写的,留了些坏习惯在代码里
mcfog
2016-02-26 16:36:25 +08:00
在 V2EX 要大家贴派森代码简直残忍(つД`)ノ
jixiangqd
2016-02-26 16:40:40 +08:00
@songkaiape 18 楼真是 Pythonic.... 突然发现我还是新手。。。水平惨不忍睹

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/259302

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX