Я работаю над функцией, которая должна рекурсивно называть себя для вычисления 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 раз прошли. Я считаю, что понимаю проблему, которая заключается в том, что моя ссылка на массив не передается в мою вспомогательную функцию должным образом.
Я не знаю точно, где я могу исправить эту проблему или как. но мне бы хотелось помочь с проблемой указателя. Спасибо вам большое за ваше время.
Task_1 называет task_1_helper с int N и int * rec_arr rec_arr - массив, заполненный -1 task1_helper заменяет rec_arr [N] на 0 или 1 , если rec_arr [N] не является -1, вы хотите вернуть значение arr [N], что 0 или 1 \t но вы получите только 0 Это правильно? Как вы называете task_1? – BobRun
Вопрос связан с проблемой времени выполнения. поэтому опубликованный код должен быть полностью компилирован. Проведенный код отсутствует. #include, #include и #include В опубликованном коде отсутствует прототип функции: 'task_1_helper()'.В опубликованном коде также отсутствует соответствующая функция main() для управления остальной частью кода. –
user3629249
в C, возвращаемое значение из malloc(), calloc() и realloc() является 'void *', поэтому может быть назначено любому другому указателю. Приведение этого возвращаемого значения только загромождает код и будет настоящей головной болью при отладке и/или выполнении обслуживания. При вызове любой из этих трех системных функций всегда проверяйте (! = NULL) возвращаемое значение, чтобы гарантировать успешную операцию – user3629249