【问题标题】:List append resets list in recursive function列表追加重置递归函数中的列表
【发布时间】:2019-02-27 13:05:02
【问题描述】:

我正在运行以下代码以递归方式尝试模拟 Hanoi,但在运行代码时,每次都会返回列表 [[1,3]],因为 hlist 在循环中被重置。我该如何纠正这个问题?

def playHanoi(p1,p2,p3,n):
    hlist=[]
    if n==1:
        hlist.append([p1,p3])
    else:
        playHanoi(p1,p3,p2,n-1)
        hlist.append([p1,p3])
        playHanoi(p2,p1,p3,n-1)
    return(hlist)

【问题讨论】:

  • 您可以尝试将 hlist 设为 playHanoi 的参数?

标签: python python-3.x list recursion


【解决方案1】:

使用global 是一种方法:

hlist = []

def playHanoi(p1,p2,p3,n):
    global hlist
    if n==1:
        hlist.append([p1,p3])
    else:
        playHanoi(p1,p3,p2,n-1)
        hlist.append([p1,p3])
        playHanoi(p2,p1,p3,n-1)
    return(hlist)

第二种(可能更简洁)的方法是使用hlist 作为函数参数:

def playHanoi(p1,p2,p3,n, hlist=None):

    if hlist is None:
        hlist = []

    if n==1:
        hlist.append([p1,p3])
    else:
        playHanoi(p1,p3,p2,n-1, hlist)
        hlist.append([p1,p3])
        playHanoi(p2,p1,p3,n-1, hlist)
    return(hlist)

【讨论】:

  • 我会选择第二个选项
  • 您实际上永远不想使用可变对象作为默认参数。这是python中很常见的错误。以下链接说明:docs.python-guide.org/writing/gotchas/…
  • @MrName 好吧,我是故意在这里做的……但我同意。固定。
  • @MrName 不,你可以使用可变的默认参数,你只需要了解语义。
【解决方案2】:

hlist 仅在函数中定义。如果您先定义 hlist=[],则每次使用 hlist.append([tobeappended]) 都会附加到(全局)列表中。

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 2017-12-15
    • 2012-04-11
    • 2012-04-10
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多