C++ c+中的意外行为+;将递增的整数传递给递归函数时
代码本身从标准输入中接受N和M,并打印从1到N的M长度组合C++ c+中的意外行为+;将递增的整数传递给递归函数时,c++,recursion,C++,Recursion,代码本身从标准输入中接受N和M,并打印从1到N的M长度组合 #include <iostream> void print(int *arr, int size) { for (int i=0; i<size; i++) std::cout << arr[i] << " "; std::cout << "\n"; } bool is_fo
#include <iostream>
void print(int *arr, int size)
{
for (int i=0; i<size; i++)
std::cout << arr[i] << " ";
std::cout << "\n";
}
bool is_found(int *arr, int size, int num)
{
for (int i=0; i<size; i++)
{
if (num == arr[i])
return true;
}
return false;
}
void recurse(int *arr, int n, int m, int cur)
{
if (cur >= m)
print(arr, m);
else
{
for (int i=1; i<=n; i++)
{
if (is_found(arr, cur + 1, i))
continue;
arr[cur] = i;
recurse(arr, n, m, cur + 1);
}
}
}
int main()
{
int *arr;
int n;
int m;
int temp;
std::cin >> n >> m;
arr = new int[n];
for (int i=0; i<n; i++)
arr[i] = 0;
recurse(arr, n, m, 0);
}
上述代码按预期工作。
但是,在递归函数中,更改这部分代码会导致意外行为
arr[cur] = i;
recurse(arr, n, m, cur + 1);
我的问题是,上面写的三个选项不是相等的吗?我不明白为什么选项1能按预期工作,而选项2和3不能。为什么将值cur+1
传递给递归函数有效,但在传递之前更改cur
的值无效
我的最佳猜测是,它与递归有关,并使用相同的数组进行递归调用,或者问题可能来自代码的完全不同部分。但我真的不知道为什么会这样。
非常感谢您的帮助!提前谢谢你 这是:
// option 1 (original, works)
arr[cur] = i;
recurse(arr, n, m, cur + 1);
不修改当前代码。循环继续进行下一个循环,cur
的值在下一次迭代中相同。另一方面
// option 2 (doesn't work)
arr[cur++] = i;
recurse(arr, n, m, cur);
// option 3 (doesn't work)
arr[cur] = i;
cur = cur + 1;
这两个修改cur
,在下一次迭代中的值将不相同。我猜想混淆是由递归引起的,但没有递归地考虑相同:
int cur = 0;
for (int i=1; i<=n; i++)
{
arr[cur] = i;
}
int cur=0;
for(inti=1;iNotice是对置换进行迭代。@Jarod42哦,我不知道!这里的目的是尝试自己写,但无论如何谢谢你:)
input: 4 4
output:
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
// option 1 (original, works)
arr[cur] = i;
recurse(arr, n, m, cur + 1);
// option 2 (doesn't work)
arr[cur++] = i;
recurse(arr, n, m, cur);
// option 3 (doesn't work)
arr[cur] = i;
cur = cur + 1;
int cur = 0;
for (int i=1; i<=n; i++)
{
arr[cur] = i;
}
int cur = 0;
for (int i=1; i<=n; i++)
{
cur = cur + 1;
arr[cur] = i;
}