2015-08-09 72 views
1

对于Java练习,我开始研究一种方法countBinary,该方法接受一个整数n作为参数,打印所有具有n数字的二进制数字,将每个值打印在单独的行上。假设n为非负数且大于0,则某些示例输出看起来像thisJava - 复杂递归回溯

我几乎没有这个地方。我能够编写一个程序,查找所有可能的String字母组合以及类似的东西,但我一直无法使用二进制和整数对这个特定问题取得任何进展。

显然,解决此问题的最佳方法是定义一个帮助器方法,该方法接受与原始方法不同的参数,并将最终打印的字符串集合为一组字符。

重要说明:本练习中我不应该使用for循环。

编辑 - 重要提示:我需要拖尾0以便所有输出的长度相同。

到目前为止,这是我:

public void countBinary(int n) 
{ 
    String s = "01"; 
    countBinary(s, "", n); 
} 
private static void countBinary(String s, String chosen, int length) 
{ 
    if (s.length() == 0) 
    { 
     System.out.println(chosen); 
    } 
    else 
    { 
     char c = s.charAt(0); 
     s = s.substring(1); 
     chosen += c; 
     countBinary(s, chosen, length); 
     if (chosen.length() == length) 
     { 
      chosen = chosen.substring(0, chosen.length() - 1); 
     } 
     countBinary(s, chosen, length); 
     s = c + s; 
    } 
} 

当我运行我的代码我的输出看起来像this

任何人都可以向我解释为什么我的方法没有按照我期望的方式运行,并且如果可能的话向我显示解决方案,以便我可以得到正确的输出?谢谢!

回答

2

有更有效的方式来做到这一点,但是这会给你一个开始:

public class BinaryPrinter { 
    static void printAllBinary(String s, int n) { 
    if (n == 0) System.out.println(s); 
    else { 
     printAllBinary(s + '0', n - 1); 
     printAllBinary(s + '1', n - 1); 
    } 
    } 

    public static void main(String [] args) { 
    printAllBinary("", 4); 
    } 
} 

我就让你制定出更有效的方式。

+0

谢谢!我将用它作为未来问题的一个模板,我一定会继续研究它,直到我完全理解你用递归完成了什么。你帮了很多! – Trafton