递归
首先选出一个数作为第一个数,后面选的数都应大于前面所选的数,选够数后输出。
C++11 代码
#include <iostream>
using namespace std;
int arr[30]{0}, maxnum, maxx;
void dfs(int nowx)
{
if (nowx > maxx)
{
for (int i = 1; i <= maxx; ++i)
cout << arr[i] << (i == maxx ? '\n' : ' ');
return;
}
for (int i = arr[nowx - 1] + 1; i <= maxnum; ++i)
{
arr[nowx] = i;
dfs(nowx + 1);
}
}
int main(int argc, char **argv)
{
cin >> maxnum >> maxx;
dfs(1);
return EXIT_SUCCESS;
}
非递归
非递归运行时间明显慢于递归的,且需要考虑如何模拟入栈,不清楚什么时候会用到。
C++11 代码
#include <iostream>
#include <stack>
using namespace std;
int arr[30]{0}, maxnum, maxx;
struct state
{
int nowx, pos;
};
int main(int argc, char **argv)
{
cin >> maxnum >> maxx;
stack<state> stk;
stk.push({1, 0});
while (!stk.empty())
{
auto tops{stk.top()};
stk.pop();
if (!tops.pos)
{
if (tops.nowx > maxx)
{
for (int i = 1; i <= maxx; ++i)
cout << arr[i] << (i == maxx ? '\n' : ' ');
continue;
}
if (arr[tops.nowx - 1] + 1 <= maxnum)
stk.push({tops.nowx, arr[tops.nowx - 1] + 1});
}
else
{
arr[tops.nowx] = tops.pos;
if (tops.pos + 1 <= maxnum)
stk.push({tops.nowx, tops.pos + 1});
stk.push({tops.nowx + 1, 0});
}
}
return EXIT_SUCCESS;
}