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

时间:2014-01-10 13:51:53

标签: python recursion

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

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

4 个答案:

答案 0 :(得分:6)

您的功能已经递归。您只需要传入0,1或5以外的数字即可看到效果:

>>> 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

答案 1 :(得分:2)

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

def fib(n):
    def aux( n ):
        if( n==1 ):
            return (0, 1)
        else:
            (a,b) = aux( n-1 )
            return b, a+b
    return  aux(n)[1]

答案 2 :(得分:0)

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

def fib():
    a, b = 0, 1
    yield a
    yield b
    while True:
        a, b = b, a + b
        yield b

示例:

>>> f = fib()
>>> next(f)
0
>>> next(f)
1
>>> next(f)
1
>>> next(f)
2
>>> next(f)
3
>>> next(f)
5
>>> next(f)
8
>>> next(f)
13

前10个斐波纳契数:

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

答案 3 :(得分:0)

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