【问题标题】:Printing every possible sub-list of a list using recursion使用递归打印列表的每个可能的子列表
【发布时间】:2021-01-26 18:39:41
【问题描述】:

我无法解决这个递归问题。递归很难理解并且能够编码,因为我是编码新手。问题是编写一个递归方法来查找给定列表的每个可能的子列表。您的方法应该接受一个字符串列表作为参数,并打印可以从该列表的元素创建的每个子列表,每行一个。假设没有重复项并且列表不为空。不要使用任何循环。

我能想到的唯一可能的方法是使用 for 循环或使用更多参数,但我不能按照说明进行操作。这就是我到目前为止所拥有的。我检查了列表 api,它说有一个可以使用的 subList 方法。我能够通过每次递归从列表大小中减去 -1 来打印前 5 个可能的子列表,然后我得到一个索引错误。这是非常令人沮丧的,所以如果有人有任何提示或指示将不胜感激。

如果你可以用循环解决它,我很想看看你会如何解决它。

public static void main(String[]args){
        ArrayList<String> list = new ArrayList<>(List.of("Janet", "Robert", "Morgan", "Char"));
        subsets(list);
        
    }


public static void subsets(List<String> list) {
        int n = list.size();
        if(list.isEmpty()){
            System.out.println(list);

        }
        if(n > 0){
            System.out.println(list.subList(0 , n));
        }
        subsets(list.subList(0,n -1));
    }

Results of my code

【问题讨论】:

  • 不能使用循环根本??
  • 说明书上说不要使用循环,所以我不能
  • 我认为如果不使用至少某种迭代是不可能的.. 和你的教授谈谈
  • 问题出自一本java编程教科书。我觉得有办法。我可能不得不
  • 嗯,我想我有一个想法,我会在答案中解释..

标签: java recursion


【解决方案1】:

我想出的最佳解决方案是基于随机性,即使它不是 Java 编程教科书所期望的,我也会发布。

您可以计算在 N 个元素的列表中存在多少 K 个元素的不同 k 组合。 例如:

  • 4 个元素的一个组合存在于 4 个列表中
  • 4 个元素的列表中存在 3 个元素的 4 个组合。

这个想法是作为递归方法的参数:

  • 要提取子列表的初始列表
  • 已打印的每个子列表的列表
  • 所需子列表大小的元素数 K

然后您应该具有以下方法签名:

public static void subsets(List<String> list, ArrayList<List<String>> alreadyPrinted, int nbOfElementsInTheSubList);

你的 main 方法中的调用将是

subsets(list, new ArrayList<>(), list.size());

现在在递归方法的主体中,处理如下(伪代码)

  • 从列表中选择一个 nbOfElementsInTheSubList 随机元素的子列表,该列表不在 alreadyPrinted 中,将其打印并添加到 alreadyPrinted
  • compute combinationNumber = list.size() 选择nbOfElementsInTheSubList(即:列表中nbOfElementsInTheSubList-combination的个数)
  • 比较alreadyTherenbOfElementsInTheSubList元素的组合数出现在alreadyPrinted
    • 如果 alreadyThere = combinationNumber :您在列表中拥有所有可用的 nbOfElementsInTheSubList-Combination,您可以使用 (nbOfElementsInTheSubList - 1) 作为最后一个 arg 递归调用您的方法
    • else:您至少缺少列表中可用的 nbOfElementsInTheSubList-Combination 之一。使用相同的 nbOfElementsInTheSubList 再次调用子集,但使用更新的 alreadyPrinted

我怀疑这是一个最佳解决方案,因此我为您的主题添加了书签,因为我对预期的代码非常好奇。

【讨论】:

  • 作为补充:这里的要点是始终调用递归方法,为其提供完整的初始列表,并精确计算子列表中预期的元素数量。通过调用 subsets(list.subList(0,n-1));你最终会丢失信息。
【解决方案2】:

如果我们想要置换列表中的所有值,那么我们可以使用此代码->

 public static void main(String[] args) {
        List<String> list = Arrays.asList("Janet", "Robert", "Morgan", "Char");
        recursiveprint(list,  new boolean[list.size()], "");

    }

    private static void recursiveprint(List<String> list,  boolean b[], String s) {

        System.out.println(s);
        for (int j = 0; j < list.size(); j++) {
            if (b[j] == false) {
                b[j] = true;
                recursiveprint(list,  b, s + list.get(j)+"  ");

                b[j] = false;
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-23
    • 2014-11-27
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多