我想将数组传递给递归函数,但我需要保留所有数组
输出:
1 0 0 0 0
1 2 0 0 0
1 2 3 0 0
1 2 3 0 0
1 2 3 0 0
当我返回上一步时,我想使用数组:1 2 0 0 0
第二次回复:1 0 0 0 0
不是这一个:1 2 3 0 0
我的目标是看到像这样的输出
1 0 0 0 0
1 2 0 0 0
1 2 3 0 0
1 2 0 0 0
1 0 0 0 0
#include<iostream>
using namespace std;
int a[100];
void go (int a[100],int x)
{
a[x]=x;
for(int i=1;i<=5;i++)cout<<a[i]<<" ";cout<<endl;
if(x==3)return;
go(a,x+1);
for(int i=1;i<=5;i++)cout<<a[i]<<" ";cout<<endl;
}
main()
{
go(a,1);
}
它只使用1个数组:/我需要它来创建另一个数组'a',当它返回上一步时不使用最后一个数组但是在该步骤中记住的数组
请帮助:(
答案 0 :(得分:2)
一般情况下,如果你不能使用C ++ 11,你可以传递C ++ 11数组类(或者向量甚至一些包含数组和重载operator []的结构,但是它会更慢,因为每一个传递数组时,它将被复制,堆栈中需要更多的内存。
#include<iostream>
#include<array>
using namespace std;
array<int, 100> a;
void go (array<int, 100> a,int x)
{
a[x]=x;
for(int i=1;i<=5;i++)cout<<a[i]<<" ";cout<<endl;
if(x==3)return;
go(a,x+1);
for(int i=1;i<=5;i++)cout<<a[i]<<" ";cout<<endl;
}
int main()
{
go(a,1);
}
我认为更好地使用std :: vector而不是std :: array如果递归会很深,因为它在堆栈上需要更少的内存,并且因为在某些程序(不是在你的例子中)中,vector可以使用构造函数/ operator =的移动版本而不是复制。
版本,使用std :: vector:
#include<iostream>
#include<vector>
using namespace std;
vector<int> a(100);
void go (vector<int> a,int x)
{
a[x]=x;
for(int i=1;i<=5;i++)cout<<a[i]<<" ";cout<<endl;
if(x==3)return;
go(a,x+1);
for(int i=1;i<=5;i++)cout<<a[i]<<" ";cout<<endl;
}
int main()
{
go(a,1);
}
答案 1 :(得分:2)
这是因为你正在使用指针,所以你不是写在临时数组中而是写在内存中。
如果使用矢量令人满意,您可以写:
#include<iostream>
#include<vector>
using namespace std;
void go(vector<int> a, int x)
{
a[x] = x;
for(int i = 1; i <= 5; i++)
cout << a[i] << " ";
cout << endl;
if(x == 3)
return;
go(a, x+1);
for(int i = 1; i <= 5; i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
vector<int> a(100, 0);
go(a, 1);
}
可执行版本:https://ideone.com/rPgjoG
//请在发布前格式化您的代码。
答案 2 :(得分:0)
为此你需要通过在递归调用之后添加行a[x + 1]=0;
来删除你放在数组中的值:
#include<iostream>
using namespace std;
int a[100];
void go (int a[100],int x)
{
a[x]=x;
for(int i=1;i<=5;i++)cout<<a[i]<<" ";cout<<endl;
if(x==3)return;
go(a,x+1);
a[x + 1]=0;
for(int i=1;i<=5;i++)cout<<a[i]<<" ";cout<<endl;
}
main()
{
go(a,1);
}
你也不需要100的数组,或者根本不需要数组,你可以这样做:
#include<iostream>
using namespace std;
void go (int x)
{
for(int i=1;i<=5;i++)cout<<(i <= x ? i : 0);
cout << endl;
if(x==3)return;
go(x+1);
for(int i=1;i<=5;i++)cout<<(i <= x ? i : 0);
cout << endl;
}
main()
{
go(1);
}