最近,我试图向某人解释将递归代码转换为迭代是多么“容易”。简单的阶乘或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);
        }

    }
}

在评论这个答案之前,请确保您理解这个问题,这不仅仅是生成所有二进制字符串的问题。

10-07 19:08
查看更多