, как указано в названии, моя функция не заканчивается хорошо. Я пытаюсь сделать следующее: "Осуществить с методом постоянного тока, функция, которая имеет этот интерфейс: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;
Чтобы закончить мой вопрос, я говорю вы заранее, что я сожалею, если отсутствует важная информация: это первый раз, когда я пользуюсь этим сайтом, пожалуйста, будьте снисходительны!
Похоже, что вы не получили правильную рекурсию, ваше конечное состояние никогда не происходит. Попробуйте выполнить код в отладчике, по очереди, перейдя в рекурсивные вызовы, чтобы увидеть, что на самом деле происходит. Вероятно, это будет утомительно и время, но он все еще является частью программиста, поэтому вам нужно его изучить. –
Я вижу проблему не пытаться отлаживать этот код ** шаг за шагом ** (по крайней мере, согласно вашему подробному описанию). –
Я хотел бы добавить, что может быть контрпродуктивным извиняться заранее, пользователи могут видеть, что вы новичок, и каждый должен принять волю. –