2015-08-01 2 views
0

, как указано в названии, моя функция не заканчивается хорошо. Я пытаюсь сделать следующее: "Осуществить с методом постоянного тока, функция, которая имеет этот интерфейс:C -Endless process in a function - найти элемент управления с помощью метода «Divide and conquer»

  • Возвращает мажоритарный элемент данной последовательности, если один такой существует

  • ПАРАМЕТРЫ

  • последовательность Действительный указатель на массив элементов
  • sequenceLength Размер массива *
  • ВОЗВРАТ
  • элемент Указатель на один элемент, соответствующий большинству
  • элемента или NULL, если такой элемент не существует

константного Элемент getMajElDC (Const Элемент * сопз * последовательность , size_t sequenceLength); "

На самом деле, я просто пытался осуществить это решение: http://www.ece.northwestern.edu/~dda902/336/hw4-sol.pdf

А вот мой способ сделать это:

const Element* getMajElDC(const Element* const * sequence, size_t,sequenceLength){ 
printf("1\n"); 

const Element* element_tmp_right; 
const Element* element_tmp_left; 
int occurence_left = 0; 
int occurence_right = 0; 


if (sequenceLength == 1) 
    return sequence[1]; 

int mid = (int)sequenceLength/2; 

element_tmp_left = getMajElDC(sequence,mid); 

if (sequenceLength%2 == 0) 
    element_tmp_right = getMajElDC(&sequence[mid],mid); 
element_tmp_right = getMajElDC(&sequence[mid],mid+1); 


if (element_tmp_left == NULL && element_tmp_right != NULL) 
    return element_tmp_right; 
if (element_tmp_right == NULL && element_tmp_left != NULL) 
    return element_tmp_left; 


if (element_tmp_right == NULL && element_tmp_left == NULL) 
    return NULL; 




if (areEqual(element_tmp_left,element_tmp_right)) 
    return element_tmp_left; 



for (int i=0;i<sequenceLength;i++){ 
    if(areEqual(sequence[i],element_tmp_left)) 
     occurence_left++; 
    if (areEqual(sequence[i],element_tmp_right)) 
     occurence_right++; 
} 

if (occurence_left > mid+1) 
    return element_tmp_left; 
else if (occurence_left > mid+1) 
    return element_tmp_left; 
else 
    return NULL; 

} 

Когда я пытаюсь запустить его в CodeBlocks, то .exe просто stopworking. Точно так же, как если бы функция была бесконечной, вот почему я поместил printf в начало: я хотел посмотреть, сколько раз «1» появится в окнах приложений, и это появляется столько раз, что все сходит с ума.

Я попытался заглянуть в базовый регистр рекурсии, но ничего не кажется неправильным ...

Я действительно потерял свое плохое знание C, кто-нибудь видит, где проблема?

Ps: функция areEqual() только данная функция, вот ее реализация, но там нет ничего особенного с ним:

bool areEqual(const Element* a, const Element* b) 
{ 
    return a->value == b->value; 
} 

с

struct element_t 
{ 
    int value; 
}; 

typedef struct element_t Element; 

Чтобы закончить мой вопрос, я говорю вы заранее, что я сожалею, если отсутствует важная информация: это первый раз, когда я пользуюсь этим сайтом, пожалуйста, будьте снисходительны!

+0

Похоже, что вы не получили правильную рекурсию, ваше конечное состояние никогда не происходит. Попробуйте выполнить код в отладчике, по очереди, перейдя в рекурсивные вызовы, чтобы увидеть, что на самом деле происходит. Вероятно, это будет утомительно и время, но он все еще является частью программиста, поэтому вам нужно его изучить. –

+0

Я вижу проблему не пытаться отлаживать этот код ** шаг за шагом ** (по крайней мере, согласно вашему подробному описанию). –

+0

Я хотел бы добавить, что может быть контрпродуктивным извиняться заранее, пользователи могут видеть, что вы новичок, и каждый должен принять волю. –

ответ

0

Вы, , должны использовать отладчик, он покажет вам, где проблема. BTW приглядеться этот код:

if (sequenceLength == 1) 
    return sequence[1]; 

int mid = (int)sequenceLength/2; 

element_tmp_left = getMajElDC(sequence,mid); 

if (sequenceLength%2 == 0) 
    element_tmp_right = getMajElDC(&sequence[mid],mid); 
element_tmp_right = getMajElDC(&sequence[mid],mid+1); 

Вы закрываете рекурсию, когда sequenceLength == 1, но если getMajElDC вызвана с sequenceLength=0 он никогда не вернется. Рассмотрим для изменения:

if (sequenceLength == 1) 
    return sequence[1]; 

к:

if (sequenceLength <= 1) 
    return sequence[1]; 
0

рассмотреть этот фрагмент кода:

int mid = (int)sequenceLength/2; 

element_tmp_left = getMajElDC(sequence,mid); 

if (sequenceLength%2 == 0) 
    element_tmp_right = getMajElDC(&sequence[mid],mid); 
element_tmp_right = getMajElDC(&sequence[mid],mid+1); 

уведомление о том, что третий вызов getMajElDC всегда вызывается независимо от значения sequenceLength. Я подозреваю, что вы хотели бы написать это:

if (sequenceLength%2 == 0) 
    element_tmp_right = getMajElDC(&sequence[mid],mid); 
else 
    element_tmp_right = getMajElDC(&sequence[mid],mid+1); 
Смежные вопросы