【问题标题】:about java recursion to create combination of string关于java递归创建字符串组合
【发布时间】:2016-10-15 23:53:55
【问题描述】:

问题是让我返回包含给定长度 n 的由“cc”和“ddd”组成的所有可能的字符串组合的集合。

例如,如果给定的长度是 5,那么 set 将包括“ccddd”和“dddcc”。 并且长度为 6 将返回包含“cccccc”、“dddddd”的集合
并且长度 7 将返回包含 "ccdddcc","dddcccc","ccccddd" 的集合 长度为 12 将返回 12 种不同的组合,依此类推

但是,返回的集合是空的。 你能帮忙吗?

“请理解极差的编码风格”

public static Set<String> set = new HashSet<String>();

public static Set<String> generateset(int n) {


    String s = strings(n,n,"");


    return set; // change this
}

public static String strings(int n,int size, String s){


    if(n == 3){
        s = s + ("cc");
        return "";}
    if(n == 2){
        s = s + ("ddd");
        return "";}
    if(s.length() == size)
        set.add(s);

    return strings(n-3,size,s) + strings(n-2,size,s); 
}

【问题讨论】:

标签: java recursion


【解决方案1】:

我认为您需要重新考虑您的方法。这不是一个简单的问题,因此,如果您对 Java 非常陌生(并且对其他编程语言不太熟悉),您可能想在解决此类问题之前尝试一些涉及集合、列表或其他集合的更简单的问题.

假设你还是想尝试一下:像这样的递归问题需要非常清楚地思考你想如何完成任务。我想你有一个大致的想法,但它需要更清楚。以下是我解决问题的方法:

(1) 您想要一个返回长度为 N 的字符串的 list(或集合)的方法。您的递归方法返回单个 String,据我所知,您对结果字符串是什么没有明确的定义。 (清晰的定义在编程中非常重要,但在解决复杂的递归问题时可能更是如此。)

(2) 字符串将以"cc""ddd" 开头。因此,要形成结果列表,您需要:

(2a) 找出所有长度为 N-2 的字符串。这是您需要递归调用以获取该长度的所有字符串的地方。遍历该列表中的所有字符串,并将"cc" 添加到每个字符串的前面。

(2b) 类似地,通过递归调用找到所有长度为 N-3 的字符串;遍历该列表中的所有字符串,并将"ddd" 添加到前面。

(2c) 结果列表将是步骤 (2a) 和 (2b) 中的所有字符串。

(3) 你需要基本情况​​。如果 N 为 0 或 1,则结果列表将为空。如果 N==2,它将只有一个字符串,"cc";如果 N==3,它将只有一个字符串,"ddd"

如果需要,您可以使用Set 代替列表,因为顺序无关紧要。

请注意,使用 全局 列表或设置来保存结果是个坏主意。当一个方法递归地调用自己,并且该方法的每次调用都触及同一个列表或集合时,你会疯狂地试图让一切正常工作。如果您让每个递归调用都拥有自己的本地列表和结果,这会容易得多。 编辑:这需要澄清。使用全局(即所有递归调用共享的实例字段)集合来保存 final 结果是可以的。但是我上面概述的方法涉及很多中间结果——即如果要查找长度为 8 的所有字符串,您还将查找长度为 6、5、4、...的字符串;使用全局来保存所有这些会很痛苦。

【讨论】:

  • 谢谢!递归对我来说仍然是一个难以理解的概念。
  • 我明白你想说什么,但我想我的 java 根本不足以实现它。我可能需要花费合理的时间来提出您描述的方法。再次感谢您的热心帮助。
【解决方案2】:

为什么set is returned empty 的答案就是遵循逻辑。假设您执行generateset(5);,它将执行strings(5,5,"");

第一次迭代 strings(5,5,""); : (s.length() == size) 是假的,因此没有添加到 set

第二次迭代 strings(2,5,""); : (n == 2) 是真的,因此没有添加到 set
第三次迭代 strings(3,5,""); : (n == 3) 为真,因此没有添加任何内容 给set

所以设置保持不变。

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2017-07-07
  • 2018-04-10
  • 2012-04-17
  • 2015-06-25
  • 2019-04-02
  • 1970-01-01
  • 2016-03-27
  • 2017-10-08
  • 2019-02-08
相关资源
最近更新 更多