如何从python中的简单函数中获得第n个结果?

时间:2013-07-21 23:49:00

标签: python fibonacci

我为这个问题的简单性道歉,我已多次搜索,但可能很简单,以前没有被问过。

我编写了一个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]

但这不起作用,我不知道为什么。谢谢你的帮助。

4 个答案:

答案 0 :(得分:0)

首先,您的函数需要知道要使用的n。这很简单 - 只需告诉它n

def fibonacci(n):

如果您想要返回第一个n斐波那契数字,则需要保留list个数字:

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

然后,计算斐波那契数字几乎与以前一样,除了在n处停止,并将最后两个列表元素加在一起而不是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 == 0n == 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的数字。修复这个作为练习)