2015-10-28 3 views
0

Я работаю над функцией, которая должна рекурсивно называть себя для вычисления 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

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

+0

Вопрос связан с проблемой времени выполнения. поэтому опубликованный код должен быть полностью компилирован. Проведенный код отсутствует. #include , #include и #include В опубликованном коде отсутствует прототип функции: 'task_1_helper()'.В опубликованном коде также отсутствует соответствующая функция main() для управления остальной частью кода. – user3629249

+0

в C, возвращаемое значение из malloc(), calloc() и realloc() является 'void *', поэтому может быть назначено любому другому указателю. Приведение этого возвращаемого значения только загромождает код и будет настоящей головной болью при отладке и/или выполнении обслуживания. При вызове любой из этих трех системных функций всегда проверяйте (! = NULL) возвращаемое значение, чтобы гарантировать успешную операцию – user3629249

ответ

2

Прежде чем мы перейдем к проблеме, [Я не хочу быть педантичным, но ...] вот несколько стилистических советов, которые могут помочь:
Отступ чисто
Не используйте «врезке» комментарии - ставят их выше линия они на
не использовать «все заглавные буквы» для переменного - это зарезервирована для #define's
не используйте мультипликатор «нестандартным» возвращается в функции

я должен был сделайте три прохода очистки на вашем коде, чтобы я мог видеть достаточно вашей логики [и я писал C для 35+ ], чтобы увидеть проблему.

В любом случае, ваша проблема не, что ссылка на массив передается неправильно - это нормально.

Проблема заключается в том, что в task_1 вы делаете:

res = task_1_helper(N, rec_arr); 

Что вы хотите:

res = task_1_helper(N - 1, rec_arr); 

Другими словами, первый вызов был индексировать мимо конца array и всегда, ссылаясь на ваш «профанальный» оператор if. Итак, вы никогда не дошли до точки любой рекурсии.

UPDATE: В task_1, если вы установите rec_arr[0] = 0; и rec_arr[1] = 1;перед тем вы называете task_1_helper, вы можете удалить первые два, если заявления в task_1_helper (то есть становится проще и будет работать быстрее)