将指针传递给数组

时间:2015-10-28 03:47:21

标签: c arrays pointers recursion dynamic-programming

我正在处理一个需要递归调用自身来计算F(N)的函数。我正在设计一种有效的递归来记忆以前称为递归的术语。不幸的是,我遇到了将数组传递给递归发生的辅助函数的问题。这是代码:

int task_1(int N){  
int res;
if(N<0) //if N is less than 0, return 0 and print bad input msg
{
    printf("Bad Input, N was less than 0: Try again\n");
    return 0;
}
int* rec_arr=(int*)calloc(N, sizeof(int));

int i;
for(i=0; i<N; i++) //filling array with incorrect values to edit when new values are written in
{
    rec_arr[i]= -1;
    //printf("%d", rec_arr[i]);
}
//printf("pre: %d\n", res);
res = task_1_helper(N, rec_arr);

//printf("post: %d\n", res);
return res;

}

int task_1_helper(int N, int* arr) //this is the helper function that computes      recursive calls
{


int rem=(N%2); //remainder check for even/odd
int res; //result integer being returned
if(N==0)
{
    res= 0; //if N=0, return base case  
    arr[N]=res;

    return res;
}
if(N==1)
{
    res = 1; //if N is 1, return base case
    arr[N]=res;

    return res;
}
//printf("%d",arr[N]);
if(arr[N]!= -1)
{
//      printf("THIS IS FUCKING SHIT UP:N|%d| arr[N]: %d\n",N,arr[N]);
    return arr[N];  
}   
//printf("THIS WORKS\n");
//  printf("N: %d, rem: %d\n", N, rem);
if(rem==0) //if N is even, return even recursive term
{
    printf("HUHUHU");
    res = ((task_1_helper((N/2), arr))+(task_1_helper((N-2), arr)));
}
else //if N is odd, return odd rec term
{
    printf("WAWAWAW");
    res = task_1_helper(((N+1)-2), arr);
}
//return 0; should not be necessary
arr[N]=res;
return res;


}

当我调用这个函数时发生的事情是,我的数组(将被传递填充N个元素,全部为-1)一旦传递就重置为所有0值。我相信我理解了这个问题,即我对数组的引用没有正确地传递给我的帮助函数。

我不确切地知道我可以在哪里解决这个问题或者如何解决这个问题。但我喜欢指针问题的一些帮助。非常感谢你的时间。

1 个答案:

答案 0 :(得分:2)

在我们解决这个问题之前,[我讨厌迂腐但是......]这里有一些可以提供帮助的风格提示:
简洁地缩进 不要使用&#34;侧边栏&#34;评论 - 将它们放在他们所依据的行之上 不要使用&#34;全部大写&#34;变量 - 为#define's保留的变量 不要使用多个&#34;非标准&#34;在函数中返回

我必须对你的代码进行三次清理,这样我才能看到足够的逻辑[并且我已经为C +写了35+]才能看到问题。

无论如何,你的问题是数组引用被错误地传递 - 没关系。

问题在于task_1你在做什么:

res = task_1_helper(N, rec_arr);

你想要的是:

res = task_1_helper(N - 1, rec_arr);

换句话说,第一个调用是在数组末尾的索引,而总是调用你的&#34; profane&#34;如果声明。所以,你永远不会达到任何递归的目的。

更新:在task_1中,如果您在之前设置rec_arr[0] = 0;rec_arr[1] = 1; ,则拨打task_1_helper,可以删除task_1_helper中的前两个if语句(即它变得更简单并且运行得更快)