C++ 使用递归时,变量的展开不符合预期

C++ 使用递归时,变量的展开不符合预期,c++,recursion,implementation,n-queens,C++,Recursion,Implementation,N Queens,提前感谢您的时间:)。当我尝试实现NQueens时,我观察到一种情况,类似于……递归后的变量实例通常会以堆栈方式展开自身,在我的情况下,除了一个二维数组之外,所有变量都会展开。它没有展开..而是保持递归调用最后一次时的状态..感谢您抽出时间提供帮助,谢谢=D 问题所在地…变量“board[100][100]”没有展开,而是像said一样,停留在递归调用的最后一个实例上。我希望它会像第一个皇后放置,第二个皇后放置,第三个皇后放置,然后第三个皇后放置,第二个皇后放置,第一个皇后放置,就像放置的变量一

提前感谢您的时间:)。当我尝试实现NQueens时,我观察到一种情况,类似于……递归后的变量实例通常会以堆栈方式展开自身,在我的情况下,除了一个二维数组之外,所有变量都会展开。它没有展开..而是保持递归调用最后一次时的状态..感谢您抽出时间提供帮助,谢谢=D

问题所在地…变量“board[100][100]”没有展开,而是像said一样,停留在递归调用的最后一个实例上。我希望它会像第一个皇后放置,第二个皇后放置,第三个皇后放置,然后第三个皇后放置,第二个皇后放置,第一个皇后放置,就像
放置的
变量一样。或者我猜这就是它的工作原理,然而,我想知道它的行为的逻辑解释,为什么“board”变量没有展开

void foo(bool board[100][100], int x, int y, int n, int m, int placed)
{
    if( placed == n )
    {
        display(board, n, m);

        return ;
    }

    int i, j;

    for(i=x; i<=n; i++)
    {
        for(j=y; j<=m; j++)
        {
            if( checkBoard(board, n, m, i, j) )
            {
                board[i][j] = true;

                display(board, n, m);
                cout<<placed;

                foo(board, 1, 1, n, m, placed+1);

                display(board, n, m);
                cout<<placed;
            }
        }
    }
}
void foo(bool board[100][100],整数x,整数y,整数n,整数m,整数放置)
{
如果(放置==n)
{
显示器(板,n,m);
返回;
}
int i,j;

对于(i=x;i对于未来的我或任何遇到同样问题的人,数组不仅仅是一个变量数组,它更像是指向变量的指针(内存宫中的内存块)。因此,在哪个递归中,变量将在以堆栈方式成功递归调用后回滚到其以前的值,但是这些数组或指针不会,因为数组或指针只是指向。因此,除非显式/手动更改,否则内存块中的值将相同,但无法展开/回滚到以前的值展开递归时的实例

我一小时前写的这段代码帮助我理解它,希望它能帮助其他人

#include <bits/stdc++.h>

using namespace std;

void display(int a[5][5], int b[5])
{
    int i, j;

    cout<<"\n===============================================\n";

    for(i=0; i<5; i++)
    {
        for(j=0; j<5; j++)
        {
            cout<<a[i][j]<<' ';
        }

        cout<<'\n';
    }

    cout<<"\n-----------------------------------------------\n";

    for(i=0; i<5; i++)
    {

        cout<<b[i]<<' ';
    }

    cout<<"\n===============================================\n";
}

void foo(int i, int j, int a[5][5], int b[5], int var, int *temp)
{
    if( i == 5 )
    {
        return ;
    }

    a[i][j] = b[i] = 1;

    display(a, b);
    cout<<var<<' '<<*temp;

    foo(i+1, j+1, a, b, var++, &(++*temp));

    display(a, b);
    cout<<var<<' '<<*temp;
}

int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int i, j, a[5][5], b[5], *temp, alpha;

    temp = &(alpha = 0);

    for(i=0; i<5; i++)
    {
        for(j=0; j<5; j++)
        {
            a[i][j] = 0;
        }

        b[i] = 0;
    }

    foo(0, 0, a, b, 0, temp);

    return 0;
}
#包括
使用名称空间std;
无效显示(int a[5][5],int b[5])
{
int i,j;

您是否希望调用此函数或其他功能时复制
board
内容?@user7860670,我希望它像第一个皇后区、第二个皇后区、第三个皇后区,然后是第三个皇后区、第二个皇后区、第一个皇后区,就像
placed
变量一样。您在代码中显示了许多坏习惯。首先还有基于一的数组索引(C++使用基于零的索引)。然后请。请。哦,试着使用语义命名的变量名,而不仅仅是单字母名。还有关于你的程序正在做什么以及为什么要这样做的注释。@Someprogrammerdude哦,我通常使用0-index。但是,由于我是递归新手,我认为很容易就可以更好地了解如何使用1-index。我不这么认为查看不包含
@Someprogrammerdude的原因感谢包含这些超链接…我之前没有注意到它们。。。
#include <bits/stdc++.h>

using namespace std;

void display(int a[5][5], int b[5])
{
    int i, j;

    cout<<"\n===============================================\n";

    for(i=0; i<5; i++)
    {
        for(j=0; j<5; j++)
        {
            cout<<a[i][j]<<' ';
        }

        cout<<'\n';
    }

    cout<<"\n-----------------------------------------------\n";

    for(i=0; i<5; i++)
    {

        cout<<b[i]<<' ';
    }

    cout<<"\n===============================================\n";
}

void foo(int i, int j, int a[5][5], int b[5], int var, int *temp)
{
    if( i == 5 )
    {
        return ;
    }

    a[i][j] = b[i] = 1;

    display(a, b);
    cout<<var<<' '<<*temp;

    foo(i+1, j+1, a, b, var++, &(++*temp));

    display(a, b);
    cout<<var<<' '<<*temp;
}

int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int i, j, a[5][5], b[5], *temp, alpha;

    temp = &(alpha = 0);

    for(i=0; i<5; i++)
    {
        for(j=0; j<5; j++)
        {
            a[i][j] = 0;
        }

        b[i] = 0;
    }

    foo(0, 0, a, b, 0, temp);

    return 0;
}