0

对于这个问题的简单性,我深表歉意,我已经搜索了多次,但它可能非常简单,以前没有人问过。

我写了一个斐波那契函数,它打印出每个低于 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]

但这没有用,我不知道为什么。感谢您的帮助。

4

4 回答 4

0

首先,您的函数需要知道n使用什么。这很简单——只要把它n作为一个论点来告诉它:

def fibonacci(n):

如果要返回第一个n斐波那契数,则需要保留它们的列表

    numbers = [0, 1] # Start off with the first 2 numbers

然后,几乎按照您之前的方式计算斐波那契数,除了在第 th 处停止,并将最后两个列表元素而不是andn相加:ab

    # 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如果您想处理这些值。

于 2013-07-22T00:04:22.830 回答
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
于 2013-07-22T00:12:43.340 回答
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
于 2013-07-22T00:14:50.997 回答
0

做这件事有很多种方法; 这是一个半聪明的:

首先,更改printyield,因此函数返回数字而不是打印它们:

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

请注意,您的函数不输出初始 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 的数字。修复这个问题留作练习)

于 2013-07-22T00:18:03.210 回答