【问题标题】:C -Endless process in a function - Find the majority element with the " Divide and conquer " methodC - 函数中的无尽过程 - 用“分而治之”的方法找到多数元素
【发布时间】:2015-10-24 02:20:29
【问题描述】:

如标题所述,我的功能并没有很好地结束。我正在尝试执行以下操作: " 用 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;

为了结束我的问题,我提前告诉你,如果缺少关键信息,我很抱歉:这是我第一次使用这个网站,请宽容!

【问题讨论】:

  • 似乎您没有正确完成递归,您的结束条件永远不会发生。尝试在调试器中逐行执行代码,单步执行递归调用,看看实际发生了什么。这可能会很乏味且耗时,但它仍然是程序员的一部分,所以你也需要学习它。
  • 我发现没有尝试逐步调试此代码的问题(至少根据您的详细描述)。
  • 我想补充一点,提前道歉可能会适得其反,用户可以看到你是新人,每个人都应该善意。

标签: c divide-and-conquer


【解决方案1】:

必须使用调试器,它会立即向您显示问题所在。 顺便说一句,仔细看看这段代码:

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

【讨论】:

    【解决方案2】:

    考虑一下这段代码 sn-p:

    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 的值如何,始终都会调用对getMajElDC 的第三次调用。我怀疑你想写这个:

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

    【讨论】:

      猜你喜欢
      • 2018-10-16
      • 2018-08-05
      • 2020-01-07
      • 2020-05-31
      • 2018-05-23
      • 2021-01-09
      • 2014-03-24
      • 2018-11-09
      相关资源
      最近更新 更多