0
点赞
收藏
分享

微信扫一扫

对于 Recursive Algorithm 中应当注意的


在利用 Recursive Algorithm 进行树遍历时,需要注意:

1、当要修改诸如List类变量时,不要影响到后面的递归调用。
例如:​​ [LeetCode]Permutations​​

private void helper(List<Integer> preList,List<Integer> remains,List<List<Integer>> ans){
//bound
if(remains.size()==0){
List<Integer> list=new ArrayList<Integer>(preList);
ans.add(list);
return;
}
for(int i=0;i<remains.size();i++){
int n=remains.get(0);
remains.remove(0);
preList.add(n);
helper(preList,remains,ans);
preList.remove(preList.size()-1);//be careful
remains.add(n); //be careful
}
}

当递归返回到本级时​​preList、remains​​已经发生改变,如果没有13-14行就会出错。

2、当对值进行修改时,不要影响到后面的递归调用。
例如:​​[LeetCode]Unique Paths​​的DFS方法中

private void helper(int x,int y,int m,int n){
//base case
if(x==m-1||y==n-1){
count++;
return;
}

if(x<m-1)
helper(x+1,y,m,n);//be careful
if(y<n-1)
helper(x,y+1,m,n);
}

9行​​helper(x+1,y,m,n);​​​别写成​​helper(++x,y,m,n);​​​,它会影响11行​​helper(x,y+1,m,n);​​​的​​x​​值。


举报

相关推荐

0 条评论