最近,我试图向某人解释将递归代码转换为迭代是多么“容易”。简单的阶乘或fibo例子实际上很容易解释。然后我们切换到二叉树,不幸的是,我无法用简单的迭代替代简单的递归代码。
下面是要替换的代码:
public class Test {
public static void bincR2(int i,int k, String buff) {
if(i<k) {
bincR2(i+1,k,buff + '0');
bincR2(i+1,k,buff + '1');
}
else {
System.out.println(buff);
}
}
public static void bincI(int k, String buff) {
// ????
}
public static void main(String[] args) {
int n = 3;
String b = "";
bincR2(0,n, b);
bincI(n, b);
}
}
结果应该从0到2^n-1的所有数字的二进制表示中打印出来对于n=3,显然是:
000个
001号
010年
2011年…111个
当然,我可以用几种不同的方法在循环中生成这样一组字符串,从简单的字符串格式到移动数字和检查最后一位。但我正在寻找一个尽可能接近递归方法的解决方案。我不想使用自己的stack和“goto”语句或任何高级字符串方法,只想使用循环、条件和变量——这必须是有可能的,正如在这里的几个线程中所述选择Java是因为没有goto语句:)
任何想法都是非常受欢迎的。
最佳答案
好吧,你需要产生2^n的值。只要没有递归的循环,你就无法在多项式复杂度上得到任何东西(可以吗?除非你迭代到n中不是多项式的东西,但是你不是在模仿递归解,是吗?)因此,恐怕你需要补偿空间复杂度——比如下面的情况,但这是一种欺骗行为,因为它仍然是“实现自己的堆栈”。我很想知道更好的解决办法。
import java.util.ArrayList;
import java.util.List;
class Main {
public static void main(String[] args) {
int N = 4;
List<String> result = new ArrayList<>();
result.add("");
for (int i = 0; i < N; i++) {
List <String> tmp = new ArrayList<>();
for (String str : result) {
tmp.add(str + "0");
tmp.add(str + "1");
}
result = tmp;
}
for (String str : result) {
System.out.println(str);
}
}
}
在评论这个答案之前,请确保您理解这个问题,这不仅仅是生成所有二进制字符串的问题。