代码之家  ›  专栏  ›  技术社区  ›  Artemis

在递归调用中更改变量是否被视为变异

  •  -3
  • Artemis  · 技术社区  · 6 年前

    我的目标是在不使用突变的情况下求和一个列表。

    def noMutObj(lst,pointer=0, result=0):
        if pointer == len(lst): 
            return result
        newResult = result + lst[pointer]
        return noMutObj(lst, pointer+1, newResult) 
    

    我们会考虑 pointer 在我们进入递归的过程中发生变化, 突变是否只适用于迭代循环中变化的变量?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Prune    6 年前

    你没有变异 pointer :您通过了 不同的 每次调用的值 noMutObj 。每个堆栈帧都有自己的 指针 ,没有任何更改。即使这样,您也只能更改本地副本。

    如果你做了以下事情

    lst.append(newResult)
    return noMutObj(lst, pointer+1, newResult)
    

    在通话之前。相反,将更改后的列表发送到下一个呼叫的正确方法是

    return noMutObj(lst[:].append(newResult), pointer+1, newResult)
    

    。。。这将创建一个新列表,并附加 newResult 并将临时对象传递到下一个级别。

    我知道这根本不是你的本意;我只是在说明句法和语义原则。

    更新

    啊。。。既然我们有了目标。。。

    突变:

    def noMutObj(lst):
        if len(lst) == 0: 
            return 0
        return lst.pop() + noMutObj(lst)
    

    无突变:

    def noMutObj(lst):
        if len(lst) == 0: 
            return 0
        return lst[0] + noMutObj(lst[1:])