Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:清理列表以便重用(斐波那契示例)_Python_List_Recursion_Pass By Reference - Fatal编程技术网

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

Python:清理列表以便重用(斐波那契示例),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

因此,我试图证明递归方法产生斐波那契数是非常低效的,我使用了一个列表,因为它们是通过引用调用的,因此一旦函数分解,它们仍然会更改相同的变量。问题是:我不知道完成后如何清理清单。这导致了一个问题,在第一次运行时,我们的列表通过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]
不会被使用,因为引用已经存在

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