在C中使用数组作为递归方法的输入

时间:2015-10-26 01:53:32

标签: c arrays recursion

我在使用数组作为递归函数中的输入存在问题这里是问题:我在第一级递归中将数组值设置为我想要的,但是在级别中对数组进行了更改递归的2-3以某种方式改变了递归级别1的数组。这不应该发生吗?因为每次调用该方法时,它应该存储特定的数组,以便它被称为对吗?

这里是该方法名为vertexCover的递归方法的代码:

 int vertexCover (int start, int covering, int seen [1000]){
        if(covering==0){

            if(start>numberOfEdges-1){
                return 1;
            }

            else{
                while(start<=numberOfEdges-1){
                    if(seen[edge1[start]]==0 && seen[edge2[start]]==0){
                        return 0;
                    }

                    start++;
                }

                return 1;
            }   

        }

        else{
            while(seen[edge1[start]]!=0 || seen[edge2[start]] !=0){
                start++;
                if(start>numberOfEdges-1){
                    return 1;
                }
            }

            seen[edge1[start]]=1;

            int a= vertexCover(start + 1, covering-1, seen);

            seen[edge1[start]]=0;
            seen[edge2[start]]=1;

            int b = vertexCover(start+1,covering-1,seen);

            if(a==1 || b==1){
                return 1;
            }

            else {
                return 0;   
            }
        }

    }

我想要做的是确保每次对递归方法的调用都有自己唯一的数组,对数组所做的更改不会影响从前一次调用中存储的数组。出于某种原因,它没有这样做。

2 个答案:

答案 0 :(得分:0)

如果你真的想要这样做,你需要像这样复制你的数组。

int vertexCover (int start, int covering, const int array [1000]){
        int seen[1000];
        memcpy(seen, array, sizeof(seen));
...
}

但是你的程序会非常慢,所以我认为你应该使用短阵列或找到另一种方法来做你想要的。

答案 1 :(得分:0)

你的职能:

int vertexCover(int start, int covering, int seen [1000]) { ... }

与以下内容相同:

int vertexCover(int start, int covering, int *seen) { ... }

因此对seen[0]所做的更改将对该指针的所有用户可见。如果你想要一个数组的本地副本,你需要明确地复制它。