gpt4 book ai didi

Python:清理我的列表以供重用(斐波那契示例)

转载 作者:太空宇宙 更新时间:2023-11-03 17:15:36 25 4
gpt4 key购买 nike

所以我试图证明生成斐波那契数的递归方法非常低效,我使用列表是因为它们是通过引用调用的,因此一旦函数拆分,它们仍然会更改相同的变量。问题:我不知道完成后如何清理列表。这导致了这样一个问题:第一次运行我们的列表时会经历所需的 1 到 5,但第二次运行时会从 6 到 10。

# 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] 不会被使用,因为引用已经存在。

del i[:] 不起作用,因为没有明确的结束,因为我们有两个结束条件,所以添加它的位置有点不清楚 - 至少对我来说是这样。

所以...我的临时修复:

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:如果有人有一个不需要两个函数的解决方案,请告诉我们 ^_^

最佳答案

我相信@jonrsharpe的建议将解决您原来的问题:

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

('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.:', 173)
('this is call nr.:', 174)
('this is call nr.:', 175)
('this is call nr.:', 176)
('this is call nr.:', 177)
55

但是可以再次调用(没有第二个参数),没有副作用。

但是,如果您确实是:

trying to show that the recursive method to produce a fibonacci number is very inefficient

公平竞争并使用高效的递归斐波那契解决方案:

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

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

关于Python:清理我的列表以供重用(斐波那契示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33693552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com