将数组传递给递归函数

passing array to recursive function

本文关键字:递归函数 数组      更新时间:2023-10-16

我想把数组传递给递归函数,但我需要保持所有数组的

输出:

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个数组:/i需要它来创建另一个数组"a",当它返回到上一步时,不使用最后一个数组,而是使用该步骤中记住的那个数组

请帮助:(

在一般情况下,您可以传递C++11数组类(或者向量,甚至是一些包含数组和重载运算符[]的结构,如果您不能使用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);
}

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

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

#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

//张贴前请格式化您的代码。

为此,您需要删除已放入数组中的值,方法是在递归调用后添加行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);
}