我正在处理一个需要递归调用自身来计算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值。我相信我理解了这个问题,即我对数组的引用没有正确地传递给我的帮助函数。
我不确切地知道我可以在哪里解决这个问题或者如何解决这个问题。但我喜欢指针问题的一些帮助。非常感谢你的时间。
答案 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语句(即它变得更简单并且运行得更快)