как упоминалось в заголовке, моя функция не заканчивается хорошо. Я пытаюсь сделать следующее: «Реализовать с помощью метода DC функцию, которая имеет этот интерфейс:
Возвращает основной элемент заданной последовательности, если он существует
ПАРАМЕТРЫ
- sequence Действительный указатель на массив элементов
- sequenceLength Размер массива *
- ВОЗВРАТ
- element Указатель на один элемент, соответствующий большинству
- элемент или NULL, если такого элемента не существует
const Element getMajElDC(const Element* const * sequence, 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;
}
Когда я пытаюсь запустить его в кодовых блоках, .exe просто перестает работать. Как если бы функция была бесконечной. Вот почему я разместил 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;
Чтобы закончить мой вопрос, я заранее сообщаю вам, что мне жаль, если важная информация отсутствует: я впервые использую этот веб-сайт, пожалуйста, будьте снисходительны!