C++ c+中的意外行为+;将递增的整数传递给递归函数时

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

代码本身从标准输入中接受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_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;
            }