模式生成递归

时间:2015-12-07 03:33:52

标签: recursion

我正在编写一个程序,通过将*替换为0或1来生成字符串1 * 0 *的所有可能组合。此程序仅提供3个值并且缺少一个值。有人可以帮我解决这段代码中的问题吗?

对于输入1 * 0 *,此解决方案仅提供3个结果:1000,1001,1101。缺失值为1100.谢谢。

public class TestClass{
        public static void generateComb (char[] ch, int index) {
            if (index == ch.length)
            {
                System.out.println (ch);

                return;
            }
            if (ch[index]=='*'){

                ch[index] = '0';
                generateComb (ch, index+1);
                ch[index] = '1';

                generateComb (ch, index+1);                        
            }
            else {
                generateComb (ch, index+1);   
                
            }
        }
        
        public static void main (String[] args) throws Exception {
        
            char[] chtest = {'1', '*', '0', '*'};
            generateComb(chtest, 0);
        }
    }

1 个答案:

答案 0 :(得分:0)

这里发生的事情是,当您说ch[index] = '0';您正在更改该对象时,您并未将该字符设置为 *,因此在第二个*转到1后,它不再被替换。这称为按引用传递char[] ch是对字符串的引用。 See this question举个例子。

这应该有效:



public class TestClass{
        public static void generateComb (char[] ch, int index) {
            if (index == ch.length)
            {
                System.out.println (ch);

                return;
            }
            if (ch[index]=='*'){

                ch[index] = '0';
                generateComb (ch, index+1);
                ch[index] = '1';
                generateComb (ch, index+1);
                ch[index] = '*'; // <-------------- here
            }
            else {
                generateComb (ch, index+1);   
                
            }
        }
        
        public static void main (String[] args) throws Exception {
        
            char[] chtest = {'1', '*', '0', '*'};
            generateComb(chtest, 0);
        }
    }
&#13;
&#13;
&#13;

每一轮中发生的事情的一个例子可能会有所帮助:

  • ch = [1,*,0,*],index == 0
  • ch = [1,*,0,*],index == 1 ch [1]更改为&#39; 0&#39;
  • ch = [1,0,0,*],index == 2
  • ch = [1,0,0,*],index == 3 ch [3]更改为&#39; 0&#39;
  • ch = [1,0,0,0],index == 4 打印:1000 返回先前的通话,ch [3]更改为&#39; 1&# 39;
  • ch = [1,0,0,1],index == 4 打印:1001 返回调用堆栈,ch [1]更改为&#39; 1& #39;
  • ch = [1,1,0,1],index == 2
  • ch = [1,1,0,1],index == 3
  • ch = [1,1,0,1],index == 4 打印:1101

使用调试器逐步执行此操作可能有助于进一步显示问题