递归到Java中的迭代

时间:2013-10-26 16:33:37

标签: java recursion iteration enumeration

我正在尝试将此递归方法转换为迭代方法。但我被困在中间。

static void string_recurse(String active,String rest) {
  if (rest.length() == 0) {
    System.out.println(active);
  } else {
    string_recurse(active + rest.charAt(0), rest.substring(1, rest.length()));
    string_recurse(active, rest.substring(1, rest.length()));
  }
}

我无法理解如何将此递归方法转换为迭代方法。 这种方法的作用是打印给定单词的所有“子集”单词。更正式的是,如果我们有字符串s_1s_2...s_n,它会枚举所有字符串s_{i1}s_{i2}...s_{ik},以便i1, i2, ..., ik{1, ..., n}i1 < i2 < ... < ik

的子集

例如,当我们调用string_recurse("","abc");时,我们得到输出:

abc
ab
ac
a
bc
b
c
(the empty word)

1 个答案:

答案 0 :(得分:2)

class Main {

    static void string_recurse(String active,String rest) {
        if (rest.length() == 0) {
            System.out.println(active);
        } else {
            string_recurse(active + rest.charAt(0), rest.substring(1, rest.length()));
            string_recurse(active, rest.substring(1, rest.length()));
        }
    }

    static void string_iterative(String s) {
        int n = s.length();
        for (int mask = (1 << n) - 1; mask >= 0; mask--) {
            String temp = "";
            for (int pos = 0; pos < n; pos++)
                if (((1 << (n - 1 - pos)) & mask) != 0)
                    temp += s.charAt(pos);
            System.out.println(temp);               
        }
    }

    public static void main(String[] args) {
        String s = "abcd";
        string_recurse("", s);
        string_iterative(s);
    }
}

注意:如果您知道字符串的长度永远不会超过32,请使用此迭代方法。如果您知道字符串的长度超过32,但64mask定义为long。如果长度可以超过64坚持原始的递归方法。

这种迭代方法的想法是将字符串的每个字符映射到101表示相应的字符参与当前子字,0表示相反。因此,要遍历所有“子集字”,我们只需要从00..0 (n bits)循环到11..1(n bits)。这可以通过循环整数范围[02^n - 1]并使用数字的二进制表示来完成。请注意,在给定的示例中,这些数字以相反的方式循环,以便迭代函数与递归函数一致。