【问题标题】:Value not stored in list of list in recursive call递归调用中未存储在列表列表中的值
【发布时间】:2021-05-13 22:31:45
【问题描述】:

下面是我的递归函数。我正在尝试在 Java 中学习回溯。在 res 对象中,我添加了列表对象,但是当从函数返回时 res 为空,而当我添加 res 时,我尝试打印列表对象,它显示值。 k 变量大于零。

    void help(int arr[],int k,int i,int n,List<Integer> list,List<List<Integer>> res){
    if(list.size()==k){
        res.add(list);        
        System.out.println(list);
        return;
    }
    for(int j=i;j<arr.length;j++){
        list.add(arr[j]);
        help(arr,k,i+1,n,list,res);
       list.remove(new Integer(arr[j]));
    }
    
}

【问题讨论】:

  • 从 res.add(new ArrayList(list)) 替换 res.add(list) 对我有用。但我仍然不清楚为什么我每次都需要创建新的 arrayList 对象。

标签: java recursion arraylist backtracking


【解决方案1】:

问题来自于操作的顺序。我在旁边加了数字来解释。

void help(int arr[],int k,int i,int n,List<Integer> list,List<List<Integer>> res){
    if(list.size()==k){
        res.add(list);        
        System.out.println(list);        // 2
        return;                          // 3 
    }
    for(int j=i;j<arr.length;j++){
        list.add(arr[j]);
        help(arr,k,i+1,n,list,res);      // 1
       list.remove(new Integer(arr[j])); // 4
    }
    
}

当您在 1 中向help 发出递归调用时,它将启动递归调用。如果您在 2 和 3 中达到基本情况,您将打印一个结果。但是,然后您回到 4 以完成递归调用链,这将开始从列表中删除元素。 这意味着您正在打印中间结果,之后还有一些操作,特别是调用 4,并且在递归结束时,您的 列表为空。这就是问题所在。

【讨论】:

  • 但是当我满足基本条件 3,4 时,我已经将我的列表对象添加到 res 对象中,而在 2 中我只是从列表对象中删除而不是从 res 所以为什么 res 显示为空。
  • 您将对list 的引用添加到res。例如,您没有在做res.add(new ArrayList&lt;&gt;(list))。这就是为什么 res 只包含对 list 的引用,该引用已被修改,因此您在 res 中看不到任何数据。
猜你喜欢
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 2022-01-15
  • 2014-07-31
  • 2016-06-28
相关资源
最近更新 更多