我正在设计一个程序来打印给定N的所有排列,这样每个数字应该大于下一个数字。
例如 如果N = 3: 输出应为123,456,789,134,145,178,189等......
初步设计:
生成所有可能的排列
将生成的排列传递给检查条件的数字提取功能
打印出结果
这是一个非常天真的算法。但由于N的动态大小,我不知道实现/初始设计。
答案 0 :(得分:4)
由于N总是小于10,我使用了递归
将该功能称为f(3,0,0)
public static void f(int N,int digit,int num)
{
if(N > 0 )
{
for(int d = digit + 1; d < 11 - N; d++) // earlier d < 10, see comments
{
f(N-1,d,num * 10 + d);
}
}else {
System.out.println(num); //add it to a list or whatever
}
}
输出:
123
124
...
678
679
689
789
答案 1 :(得分:2)
最简单的方法是使用递归。假设您已生成第一个 n 数字,并且生成的最后一个数字是 i 。您要生成 N - n 数字,并且必须以 i + 1或更高版本开头。由于最后一个数字不能超过9,下一个数字不能超过10 - ( N - n )。这给出了递归的基本规则。这样的事情(在Java中)应该有效:
void generate(int N) {
int[] generated = new int[N];
generate(generated, 0);
}
void generate(int[] generated, int nGenerated) {
if (nGenerated == generated.length) {
// print the generated digits
for (int g : generated) {
System.out.print(g);
}
System.out.println();
return;
}
int max = 10 - (generated.length - nGenerated);
int min = nGenerated == 0 ? 1 : (generated[nGenerated - 1] + 1);
for (int i = min; i <= max; ++i) {
generated[nGenerated] = i;
generate(generated, nGenerated + 1);
}
}
答案 2 :(得分:1)
只需按字典顺序生成它们:
123
124
125
...
134
135
...
145
...
234
235
...
245
...
345
这假设您的数字最多为5.对于较大的界限B
,请继续。一些简单的代码是:
nextW = w;
for (int i=n-1; i>=0; --i) {
// THE LARGEST THE iTH DIGIT CAN BE IS B-(n-i-1)
// OTHERWISE YOU CANNOT KEEP INCREASING AFTERWARDS
// WITHOUT USING A NUMBER LARGER THAN B
if w[i]<B-(n-i-1) {
// INCREMENT THE RIGHTMOST POSITION YOU CAN
nextW[i] = w[i]+1;
// MAKE THE SEQUENCE FROM THERE INCREASE BY 1
for (int j=i+1; j<N; ++j) {
nextW[j] = w[i]+j-i+1;
}
// VOILA
return nextW;
}
}
return NULL;
从w = [1,2,3,...,N];
开始(使用for
循环轻松制作),打印w
,以w
作为输入调用上面的函数,打印并继续。使用N = 3
和B = 5
,答案将是上面的列表(没有......行)。
如果没有绑定B
,那么你就是SOL,因为它有无限多。
一般情况下,您正在计算N
elementary symmetric function e_N
。