Python:清理列表以便重用(斐波那契示例)
因此,我试图证明递归方法产生斐波那契数是非常低效的,我使用了一个列表,因为它们是通过引用调用的,因此一旦函数分解,它们仍然会更改相同的变量。问题是:我不知道完成后如何清理清单。这导致了一个问题,在第一次运行时,我们的列表通过1到5,这是需要的,但从第二次运行开始,从6到10Python:清理列表以便重用(斐波那契示例),python,list,recursion,pass-by-reference,Python,List,Recursion,Pass By Reference,因此,我试图证明递归方法产生斐波那契数是非常低效的,我使用了一个列表,因为它们是通过引用调用的,因此一旦函数分解,它们仍然会更改相同的变量。问题是:我不知道完成后如何清理清单。这导致了一个问题,在第一次运行时,我们的列表通过1到5,这是需要的,但从第二次运行开始,从6到10 # Iterative method has exactly n repetitions # let's compare recursive method: def fiborec(n, i = []): i.app
# Iterative method has exactly n repetitions
# let's compare recursive method:
def fiborec(n, i = []):
i.append(len(i)+1)
print('this is call nr.:', len(i))
if n == 0:
return 0
elif(n == 1):
return 1
else:
return fiborec(n - 1, i) + fiborec(n - 2, i)
我还尝试:
def fiborec(n, i = [0]):
i[0] += 1
print('this is call nr.:', i[0])
这两种方法都显示了相同的行为:(这使我想到,i=[0]
不会被使用,因为引用已经存在
deli[:]
不起作用,因为没有明确的结束,因为我们有两个结束条件,所以添加它的位置有点不清楚——至少对我来说是这样
所以…我的临时解决方案:
def fiborec(n):
"""Docstring: returns Fibonacci Number for given Int.
recursive method
"""
i = [0] # we want i to be "passed by reference" due to lots of function calls
# but also to be resetted should we reuse the function
return _fiborecursion(n, i)
我不喜欢,但这是我现在能想到的最好的了D:
如果有人有我不需要两个函数的解决方案,请告诉我们^ ^我相信@jornsharpe的建议会解决您原来的问题:
def fiborec(n, i=None):
if i is None:
i = [1]
else:
i.append(len(i) + 1)
print('this is call nr.:', i[-1])
if n == 0:
return 0
elif n == 1:
return 1
else:
return fiborec(n - 1, i) + fiborec(n - 2, i)
为fiborec(10)生成:
但可以再次调用(无第二个参数),而不会产生副作用
但是,如果您确实是:
试图说明递归方法产生的斐波那契数
效率很低
公平竞争,使用高效的递归斐波那契解决方案:
def fibofast(n, res=0, nxt=1, i=None):
if i is None:
i = [1]
else:
i.append(len(i) + 1)
print('this is call nr.:', i[-1])
if n == 0:
return res
return fibofast(n - 1, nxt, res + nxt, i)
为fibofast(10)生成:
使用
i=None
作为默认值,然后在首次调用函数时检查如果i为None:i=[]
。这是避免此问题的典型方法()。或者作为一个装饰器来实现记忆。好吧,我现在决定创建一个只运行一次的函数来重置计数器,然后调用递归函数…在我看来并不漂亮,但这是我能想到的最好的。不过,我一定要通读链接。TY
def fibofast(n, res=0, nxt=1, i=None):
if i is None:
i = [1]
else:
i.append(len(i) + 1)
print('this is call nr.:', i[-1])
if n == 0:
return res
return fibofast(n - 1, nxt, res + nxt, i)
('this is call nr.:', 1)
('this is call nr.:', 2)
('this is call nr.:', 3)
('this is call nr.:', 4)
('this is call nr.:', 5)
('this is call nr.:', 6)
('this is call nr.:', 7)
('this is call nr.:', 8)
('this is call nr.:', 9)
('this is call nr.:', 10)
('this is call nr.:', 11)
55