DFS中c ++和Python之间的区别

时间:2017-07-21 13:57:50

标签: python c++ dfs

目前我正在处理Leetcode Problem 39组合和,并试图用C ++和Python来解决它。

算法是一个基本的DFS,我的问题是关于dfs部分。当我用C ++将代码复制到Python时,它似乎不起作用。以下是Python中的self.dfs部分:

    dfs(self, candidates, target, start, comb, res):
        if target == 0:
            res.append(comb)
        elif target < 0:
            return
        else:
            for i in range(start, len(candidates)):
                comb.append(candidates[i])
                self.dfs(candidates, target-candidates[i], i, comb, res)
                comb.pop()

在这段代码中,我在res中得到了空列表。然而,如果我将最后一个“其他”部分改为:

    for i in range(start, len(candidates)):
        self.dfs(candidates, target-candidates[i], i, comb+[candidates[i]], res)

确实有效。

所以我想知道它可能是Python和C ++之间的区别,也许是使用引用?有谁能搞清楚?

为方便起见,我还在这里附上C ++代码:

    void dfs(vector<vector<int>>& candidates, int target, int i, vector<int>& comb, vector<vector<int>>& res){
      if (target < 0)
         return;
      else if (target == 0)
         res.push_back(comb);
      else{
         for (int i=start; i<candidates.size(); ++i){
            comb.push_back(candidates[i]);
            dfs(candidates, target-candidates[i], i, comb, res);
            comb.pop_back();
      }
     }
    }

1 个答案:

答案 0 :(得分:0)

在您的C ++代码中,执行以下操作:

res.push_back(comb);

您正在复制comb的数据(因为res是&#34;列表&#34;&#34;列表&#34;整数),即使{ {1}}作为参考传递。

在你的python代码(第一个代码片段)中,你永远不会复制,所以comb的所有元素都是相同的列表。为了相同,您可以这样做:

res

res.append(list(comb))

您的修复(在递归调用函数时传递副本)可以正常工作,但即使不需要也会复制。您只需要在追加到res.append(comb[:])

时制作副本

(重现&#34; bug&#34;在C ++中你必须在向量指针上创建一个向量并存储res的地址,这样就不会复制了)