0

我想将数组传递给递归函数,但我需要保留所有数组

输出 :

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”,当它返回上一步时不使用最后一个数组,而是使用该步骤中记住的数组

请帮忙 :(

4

3 回答 3

2

在一般情况下,您可以传递 C++11 数组类(或向量,甚至一些包含数组和重载 operator[] 的结构,如果您不能使用 C++11),但它会更慢,因为每次当您传递数组它将被复制,并且堆栈中需要更多的内存。

#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 可以使用构造函数/操作符 = 的移动版本而不是复制.

使用 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);
}
于 2013-09-02T13:27:48.120 回答
2

这是因为您使用的是指针,所以您不是在临时数组中而是在内存中写入。

如果使用 vector 对你来说是满意的,你可以写:

#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

// 请在发布之前格式化您的代码。

于 2013-09-02T13:36:02.197 回答
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);
}
于 2013-09-02T13:17:35.270 回答