2013-10-23 57 views
6

我想要一种算法来生成所有可能的N位数字,其数字按升序排列。算法生成所有可能的N位数字,其数字递增顺序

例如:如果N = 3,则可能数是:012,123,234,246,567,259,因为:

...

等。

我该怎么办?

我开发了以下算法,但它只生成连续增加数字的数字,如123,234,345,456,567等。因此,一大组数字被遗漏。

private static void generate(int start,int n) 
{ 
    if((start+n)>9) 
     return; 
    else 
    { 
     for(int i=0;i<n;i++) 
      System.out.print(start+i); 

     System.out.println(); 
     generate(start+1,n); 
    } 
} 
+6

试着将问题解决为一组较小的问题。例如,您需要生成10位数字。如果你已经有9位数字的数字解决了,你可以得到你的答案吗? 5位数字呢? –

回答

5

试图保留原始的想法:

private static void generate(int prefix, int start, int n) 
    { 
     if (n == 0) 
     { 
      System.out.print(prefix); 
      System.out.println(); 
     } 
     else 
     { 
      for(int i=start;i<10;i++) 
       generate(10*prefix+i, i+1, n-1); 
     } 
    } 
+0

不错,简单,做得好! – DDW

+0

'System.out.print(prefix); System.out.println();''可以只是'System.out.println(前缀);' – BartoszKP

+0

@BartoszKP OP没有提及任何编程语言,所以我假定只是伪代码。 – Henrik

0

从更声明角算法看起来几乎像数学符号(在Haskell):

generate = toInt [[a,b,c] | a <- x, b <- x, c <- x, a < b, b < c] 
    where x = [0..9] 
     toInt = map (foldl (\n m -> 10*n + m) 0) 

其中map (foldl (\n m -> 10*n + m) 0)只是将一个整数 的数字列表,其余的是自我记录:取三位数字,同时服从给定的约束。

相关问题