将数组传递给递归函数

时间:2013-09-02 13:14:03

标签: c++ arrays recursion

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

输出:

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

请帮助:(

3 个答案:

答案 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);
}