递归回溯算法期间变量未更改

Posted

技术标签:

【中文标题】递归回溯算法期间变量未更改【英文标题】:Variable not being changed during recursive backtracking algorithm 【发布时间】:2019-07-08 16:02:56 【问题描述】:

我正在使用递归和回溯来解决问题。每当满足某个条件时,我都会更新名为 minimum 的变量。然而,尽管minimum 变量在函数返回时被多次更新,minimum 仍然设置为其原始值。

我不明白为什么,因为我传递了对内存中同一位置的引用,并在遇到基本情况时更新它。

def minCost(self, costs: List[List[int]]) -> int:
        depth, cost, prev_index, minimum = 0, 0, None, 10000

        def min_cost_recur(depth, cost, prev_index, n, minimum, costs):
            if depth == n:
                minimum = min(minimum, cost)
                return

            original_prev_index = prev_index*1

            for i in range(0, 3):
                if not i == original_prev_index:
                    cost += costs[depth][i]
                    depth += 1
                    prev_index = i
                    min_cost_recur(depth, cost, prev_index, n, minimum, costs)
                    depth-=1
                    cost -= costs[depth][i]
                    prev_index = original_prev_index

        min_cost_recur(depth, cost, -1, len(costs), minimum, costs)

        return minimum

【问题讨论】:

【参考方案1】:

您应该在递归中返回 minimum 的新值,否则它将永远不会更新:

def minCost(self, costs: List[List[int]]) -> int:
        depth, cost, prev_index, minimum = 0, 0, None, 10000

        def min_cost_recur(depth, cost, prev_index, n, minimum, costs):
            if depth == n:
                minimum = min(minimum, cost)
                return minimum

            original_prev_index = prev_index*1

            for i in range(0, 3):
                if not i == original_prev_index:
                    cost += costs[depth][i]
                    depth += 1
                    prev_index = i
                    minimum = min(minimum, min_cost_recur(depth, cost, prev_index, n, minimum, costs))
                    depth-=1
                    cost -= costs[depth][i]
                    prev_index = original_prev_index
            return minimum
        minimum = min_cost_recur(depth, cost, -1, len(costs), minimum, costs)

        return minimum

这是因为minimum 不是通过引用传递,而是通过值传递,因为它是不可变类型的实例。当您在递归中修改其值时,它只是为最小值创建一个本地 nmae,而不是从父范围更改变量。

【讨论】:

我不知道整数在 Python 中是不可变的。谢谢。

以上是关于递归回溯算法期间变量未更改的主要内容,如果未能解决你的问题,请参考以下文章

算法回溯:如何在不存储状态的情况下进行递归

算法入门(回溯算法)

Java数据结构与算法——递归与回溯

递归和回溯求解8皇后问题

递归和回溯求解8皇后问题

回溯0--递归回溯算法框架