我正在尝试将此递归方法转换为迭代方法。但我被困在中间。
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)
答案 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
,但64
将mask
定义为long
。如果长度可以超过64
坚持原始的递归方法。
这种迭代方法的想法是将字符串的每个字符映射到1
或0
。 1
表示相应的字符参与当前子字,0
表示相反。因此,要遍历所有“子集字”,我们只需要从00..0 (n bits)
循环到11..1(n bits)
。这可以通过循环整数范围[0
,2^n - 1
]并使用数字的二进制表示来完成。请注意,在给定的示例中,这些数字以相反的方式循环,以便迭代函数与递归函数一致。