Python 如何创建递归函数来计算斐波那契数
如何使其递归?当我运行程序并输入一个数字时,相同的数字会返回您的函数已经是递归的。您只需输入除0、1或5以外的数字即可查看效果: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
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的代码时间复杂度不是二次的;它是指数型的(更糟)。