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