Python写递归算法时参数传递的坑以及应对办法

众所周知,python中一切变量皆是对象,也就导致了函数传参时,可变类型都是引用传递;这一特点很方便,但是写递归算法时,递归函数结束出栈时,相应的可变类型(如列表、字典等)却无法变回上一层函数调用时的状态了。

  • 解决办法一:

在下一个递归调用操作未知的情况下,操作前先使用copy生成副本,在副本上修改后再传入下一层递归,如以下代码中最后三句话

def getOne(cursor:int,curRes:List[int]):
            nonlocal array
            nonlocal res
            if len(curRes)==k:
                res.append(curRes)
                return
            for i in range(cursor,n):
                if n-i

值得一提的是,如果列表中有更复杂的对象,需要使用python深拷贝(deepcopy)才能奏效

  • 解决办法二:

在下一个递归调用操作已知的情况下,递归结束后多加一句恢复语句。如以下代码中:

        def getAround(x,y,i):
            nonlocal visited
            if i==len(word):
                return True
            if x-1>-1 and board[x-1][y]==word[i] and not (x-1,y) in visited:
                visited.add((x-1,y))
                if getAround(x=x-1,y=y,i=i+1):
                    return True
                visited.remove((x-1,y))

visited字典在递归调用前加入某元组,则在递归跳出后也删除相应元组。

你可能感兴趣的:(Python写递归算法时参数传递的坑以及应对办法)