C-函数中的无限过程 - 用"找到多数元素划分和征服"方法

时间:2015-08-01 13:43:41

标签: c divide-and-conquer

如标题中所提到的,我的功能并没有很好地结束。我正在尝试执行以下操作: "使用DC方法实现具有此接口的函数:

  • 返回给定序列的多数元素(如果存在)

  • 参数

  • sequence指向元素数组的有效指针
  • sequenceLength数组的大小 *
  • RETURN
  • element指向与大多数
  • 对应的一个元素的指针
  • 元素,如果不存在此类元素,则为NULL

const元素 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;

}

当我尝试在codeblocks中运行它时,.exe只是停止工作。就像功能无穷无尽一样。这就是为什么我在开头放置一个printf的原因:我想知道&#34; 1&#34;将出现在应用程序窗口中,它出现很多次,一切都变得疯狂。

我试着查看递归的基本情况,但似乎没有任何问题......

我真的失去了对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;

为了结束我的问题,我事先告诉你,如果遗漏了重要信息,我很抱歉:这是我第一次使用本网站,请放纵!

2 个答案:

答案 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];

答案 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);