【问题标题】:Recursive function return value keeps the results from previous runs [duplicate]递归函数返回值保留以前运行的结果[重复]
【发布时间】:2013-11-27 12:38:51
【问题描述】:

我有以下递归函数

def collatz(n,seq=[]):
    seq.append(n)
    if n == 1:
        return seq
    if n%2 == 0:
        return collatz(n/2, seq)
    else:
        return collatz((3*n)+1, seq)

当我多次运行这个函数时,seq 仍然包含之前运行的值:

>>> collatz(1)
[1]                # correct
>>> collatz(2)
[1, 2, 1]          # should be [2,1]
>>> collatz(3)
[1, 2, 1, 3, 10, 5, 16, 8, 4, 2, 1]  # should be [3, 10, 5, 16, 8, 4, 2, 1]

防止这种情况的方法是在调用collatz时给seq一个空列表:

>>> collatz(3,seq=[])
[3, 10, 5, 16, 8, 4, 2, 1]

有没有办法以不同的方式编写collatz,以便我可以使用collatz(3) 而不是collatz(3,seq=[]

【问题讨论】:

    标签: python recursion return


    【解决方案1】:

    使用seq=None作为默认值并在函数内部添加一个if条件:

    def collatz(n, seq=None):
        seq = [] if seq is None else seq
        seq.append(n)
        if n == 1:
            return seq
        if n%2 == 0:
            return collatz(n/2, seq)
        else:
            return collatz((3*n)+1, seq)
    

    相关:“Least Astonishment” in Python: The Mutable Default Argument

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-22
      • 2017-11-07
      • 1970-01-01
      • 2015-06-17
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多