嘿,我试图在混合中使用单个变量输出Fibonacci序列。通常,如果我使用2个变量,我会设置如下:
nmbr1 = nmbr2 = 1
while nmbr1 < 100:
nmbr1, nmbr2 = nmbr1 + nmbr2, nmbr1
print (nmbr1)
但是如何在python中只用一个变量来完成序列?
答案 0 :(得分:4)
由于没有人提到变量应该是什么类型的对象,这里使用的是list
; - )
x = [1, 1]
while x[0] < 100:
x = x[1], sum(x)
print(x[0])
1
2
3
5
8
13
21
34
55
89
144
如果真的想要偷偷摸摸,你可以使用黄色比率近似来使用closed form solution作为Fibonacci系列。
def fib(n):
return int((((1 + 5 ** .5) / 2) ** n) / (5 ** .5) + .5)
f = c = 1
while f < 100:
c += 1
f = fib(c)
print(f)
1
2
3
5
8
13
21
34
55
89
144
这只使用一个变量 - n
- 并且会在恒定时间内计算 F[n]
。运行一个循环并继续连续调用fib
。
答案 1 :(得分:3)
def fib(n):
if n <= 2: return 1
return fib(n-1) + fib(n-2)
print fib(12) # the 12th fibinocci number
也许......它的工作方式与你的有点不同,它可能会因大数字而分崩离析
答案 2 :(得分:1)
这是一个有趣的解决方案。 memoization组件由Efficient calculation of Fibonacci series提供。
import functools
@functools.lru_cache(None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
def fib_yield(n):
for i in range(n):
yield fib(i)
list(fib_yield(10)) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
答案 3 :(得分:1)
是的,绝对同意@ joran-beasley
最快和最先进的技术是Memoization技术,虽然它很复杂。 Memoization避免通过存储它们来计算已计算的值,这里我们可以将它存储在字典中,其位置为键。
中的一个非常古老的答案中学到了这一点