我为这个问题的简单性道歉,我已多次搜索,但可能很简单,以前没有被问过。
我编写了一个Fibonacci函数,可以将每个Fibonacci数打印在3000以下。
def fibonacci():
a, b = 0, 1
while b < 3000:
a, b = b, a + b
print a
return a
如何才能使它返回前n个斐波纳契数?
另外,我怎样才能让它只打印第n个值?例如print [6],它将返回8。 我试着把它变成一个字符串:
a = str(fibonacci())
print a[6]
但这不起作用,我不知道为什么。谢谢你的帮助。
答案 0 :(得分:0)
首先,您的函数需要知道要使用的n
。这很简单 - 只需告诉它n
:
def fibonacci(n):
如果您想要返回第一个n
斐波那契数字,则需要保留list个数字:
numbers = [0, 1] # Start off with the first 2 numbers
然后,计算斐波那契数字几乎与以前一样,除了在n
处停止,并将最后两个列表元素加在一起而不是a
和b
:
# xrange(2, n) is a sequence going from 2 to n-1
for i in xrange(2, n):
# Add together the last two fibonacci numbers and append the result
# to the list
numbers.append(numbers[-2] + numbers[-1])
最后,返回列表:
return numbers
最终结果:
def fibonacci(n):
numbers = [0, 1]
for i in xrange(2, n):
numbers.append(numbers[-2] + numbers[-1])
return numbers
这将返回第一个n
斐波纳西数的列表(n >= 2
)。如果您想处理这些值,则需要使用特殊情况n == 0
或n == 1
。
答案 1 :(得分:0)
您可以将您的函数转换为生成器并在列表推导中使用它。创建的列表中的最后一个数字是第n个斐波纳契数(fibonacci(n)
)的值:
def fibonacci(n):
a, b = 0, 1
count = 0
while count < n:
a, b = b, a + b
count += 1
yield a
fibs = [fib for fib in fibonacci(6)]
print fibs
print 'fibonacci(6):', fibs[-1]
输出:
[1, 1, 2, 3, 5, 8]
fibonacci(6): 8
答案 2 :(得分:0)
创建一个生成器:
def fibonacci():
a, b = 0, 1
while True:
a, b = b, a + b
yield a
创建一个包装器来调用它n次
def fibn(n):
g= fibonacci()
return [next(g) for _ in xrange(n)][-1]
>>> fibn(5)
5
>>> fibn(15)
610
答案 3 :(得分:0)
有几种方法可以做到这一点;这是一个半聪明的人:
首先,将print
更改为yield
,因此该函数会返回数字而不是打印它们:
def ifibonacci():
a, b = 0, 1
while b < 3000:
a, b = b, a + b
yield a
然后使用itertools.islice
切出您想要的数字:
import itertools
print list(itertools.islice(ifibonacci(), 10))
# prints [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
print list(itertools.islice(ifibonacci(), 6, 6+1))
# prints [13] which isn't quite right; see below
请注意,您的函数不会输出the initial 0,因此索引会逐一输出。要解决此问题,请将yield
向上移动一行:
def ifibonacci():
a, b = 0, 1
while b < 3000:
yield a
a, b = b, a + b
print list(itertools.islice(ifibonacci(), 6, 6+1))
# prints [8]
(另外,这仍然不会打印大于3000的数字。修复这个作为练习)