作为同事的算法课程的一部分,我们必须设计一个递归函数,生成所有n位数的组合。
这是一个例子:
示例输入:
3
示例输出:
111
112
113
121
122
123
131
132
133
211
212
213
221
222
223
231
232
233
311
312
313
321
322
323
331
332
333
我想指出我已经解决了这个问题,所以人们不会评论这是作业,我必须自己做。 无论如何,这是我在C ++中的代码:
void S6_1(int r, int n, int p, int d)
{
if (d == 0)
return;
S6_1(r, n, p, d - 1);
r = r * 10 + d;
if (p == 1)
cout << r << endl;
else
S6_1(r, n, p - 1, n);
}
void S6(int n)
{
S6_1(0, n, n, n);
}
我发布这个的主要原因是我坚信必须有另一种方法来解决这个问题。
我非常感谢您提供的任何帮助
答案 0 :(得分:2)
以归纳的方式思考:如何将生成所有n位数字的问题与[1..n]中的数字分成一个较小的自身实例加上多一点工作?也许最明显的是将所有可能的数字添加到递归生成的所有(n-1)个数字的前面。我将使用C(但C ++类似)一次一个地在缓冲区中累积数字。
// In buf[i..n-1], enumerate all numbers having n-i digits with values in [1..n].
void print_all(char *buf, int i, int n) {
if (i == n) { // Here n - i == 0, so we're done. Print.
printf("%.*s\n", n, buf);
return;
}
for (int digit = 1; digit <= n; ++digit) {
buf[i] = digit + '0'; // put a digit at position i
print_all(buf, i + 1, n); // recursively put the rest
}
}
要打电话:
char buf[n];
print_all(buf, 0, n);
在int
中构建数字也可以。代码有点短,但是它将int
分解成一个字符串printf
,所以从某种意义上讲它是双重的工作:
void print_all(int b, int i, int n) {
if (i == n) {
printf("%d\n", b);
return;
}
for (int digit = 1; digit <= n; ++digit) {
print_all(10 * b + digit, i + 1, n);
}
}
并称之为......
print_all(0, 0, n);
修改强>
正如我在评论中指出的那样,用更难以理解的递归替换明显的循环应用程序并不聪明。但既然你问过,
// Enumerate all numbers formed by appending to the number in b all (n-i)-digit
// numbers starting with a digit in [d..n] and all other digits in [1..n].
void print_all(int d, int b, int i, int n) {
if (d > n) return;
if (i == n) {
printf("%d\n", b);
return;
}
print_all(1, 10 * b + d, i + 1, n); // enumerate all with more digits
print_all(d + 1, b, i, n); // enumerate other values of i'th digit
}
致电:
print_all(1, 0, 0, n);
答案 1 :(得分:1)
你的解决方案很好,但有很多变数。我会像这样使用递归:
#include <cstdio>
using namespace std;
void rec(int i, int n, int number){
if(i == n) {
printf("%d\n", number); //newline
return; //another n digit number completed
}
for(int j = 1; j <= n; j++){
rec(i + 1, n, number * 10 + j); // *10 + --> adds the new digit
}
return;
}
int main(int argc, char *args[]){
int n = 3; //read n from input
rec(0, n, 0); //this will go n level in depth and before going on each level prints one digit
return 0;
}