Python 如何创建递归函数来计算斐波那契数

Python 如何创建递归函数来计算斐波那契数,python,recursion,Python,Recursion,如何使其递归?当我运行程序并输入一个数字时,相同的数字会返回您的函数已经是递归的。您只需输入除0、1或5以外的数字即可查看效果: def fib(n): if n == 0: return 0 elif n ==1: return 1 else: return fib (n-1) + fib (n-2) 您的函数已经是递归的。您只需输入除0、1或5以外的数字即可查看效果: def fib(n): if n == 0

如何使其递归?当我运行程序并输入一个数字时,相同的数字会返回

您的函数已经是递归的。您只需输入除0、1或5以外的数字即可查看效果:

def fib(n):
    if n == 0:
        return 0
    elif n ==1:
        return 1
    else:
        return fib (n-1) + fib (n-2)

您的函数已经是递归的。您只需输入除0、1或5以外的数字即可查看效果:

def fib(n):
    if n == 0:
        return 0
    elif n ==1:
        return 1
    else:
        return fib (n-1) + fib (n-2)

作为练习,这里有一个斐波那契序列生成器 它不使用递归,因此不会命中 Python对
n
的大值的递归限制:

>>> def fib(n):
...     if n == 0:
...         return 0
...     elif n ==1:
...         return 1
...     else:
...         return fib (n-1) + fib (n-2)
... 
>>> fib(0)  # returns immediately, because n == 0
0
>>> fib(1)  # returns immediately, because n == 1
1
>>> fib(2)  # returns fib(1) + fib(0) == 1 + 0 == 1
1
>>> fib(3)  # returns fib(2) + fib(1) == (fib(1) + fib(0)) + 1 == (1 + 0) + 1 == 2
2
>>> fib(100) # returns fib(99) + fib(98) == (fib(98) + fib(97)) + (fib(97) + fib(96)) == ...
# This one takes a while because 2**100 calculations need to be completed
354224848179261915075
示例:

def fib():
    a, b = 0, 1
    yield a
    yield b
    while True:
        a, b = b, a + b
        yield b
前10个斐波那契数:


作为练习,这里有一个斐波那契序列生成器 它不使用递归,因此不会命中 Python对
n
的大值的递归限制:

>>> def fib(n):
...     if n == 0:
...         return 0
...     elif n ==1:
...         return 1
...     else:
...         return fib (n-1) + fib (n-2)
... 
>>> fib(0)  # returns immediately, because n == 0
0
>>> fib(1)  # returns immediately, because n == 1
1
>>> fib(2)  # returns fib(1) + fib(0) == 1 + 0 == 1
1
>>> fib(3)  # returns fib(2) + fib(1) == (fib(1) + fib(0)) + 1 == (1 + 0) + 1 == 2
2
>>> fib(100) # returns fib(99) + fib(98) == (fib(98) + fib(97)) + (fib(97) + fib(96)) == ...
# This one takes a while because 2**100 calculations need to be completed
354224848179261915075
示例:

def fib():
    a, b = 0, 1
    yield a
    yield b
    while True:
        a, b = b, a + b
        yield b
前10个斐波那契数:


您的解决方案是一个关于递归可能出错的示例,因为对于一个具有线性复杂度的平凡解决方案的问题,它表现出二次复杂度。这里通常不使用递归。也就是说,这里可以使用递归来保持线性复杂性:

>>> from itertools import islice
>>> list(islice(fib(), 0, 10))
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

您的解决方案是一个关于递归可能出错的示例,因为对于一个具有线性复杂度的平凡解决方案的问题,它表现出二次复杂度。这里通常不使用递归。也就是说,这里可以使用递归来保持线性复杂性:

>>> from itertools import islice
>>> list(islice(fib(), 0, 10))
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

该函数已经是递归的,并且是正确的。您一定使用了非常少的测试。如果您的测试方法产生了这些结果,您只能使用数字0、1和5中的一些。尝试较大的整数。

函数已经是递归的,并且正确。您一定使用了非常少的测试。如果您的测试方法产生了这些结果,您只能使用数字0、1和5中的一些。尝试更大的整数。

如何调用此函数的可能重复?@aga使用fib(0)、fib(1)或fib(5)。参见Martijn的@HenkLangeveld我知道如何调用函数,我想知道OP是如何做到这一点的-这个函数已经是递归的,所以为了得到他得到的问题(“当我运行程序并输入一个数字时,同一个数字被返回”),他必须以错误的方式调用它。@aga,我试图指出OP的测试方法并不详尽。对于[0,1,5]中的任何值,他将得到描述的结果。OP的样本空间太小。如何调用此函数可能存在重复?@aga使用fib(0)、fib(1)或fib(5)。参见Martijn的@HenkLangeveld我知道如何调用函数,我想知道OP是如何做到这一点的-这个函数已经是递归的,所以为了得到他得到的问题(“当我运行程序并输入一个数字时,同一个数字被返回”),他必须以错误的方式调用它。@aga,我试图指出OP的测试方法并不详尽。对于[0,1,5]中的任何值,他将得到描述的结果。OP的样本空间太小,代码时间复杂度不是二次的;OP的代码时间复杂度不是二次的;它是指数型的(更糟)。