【发布时间】: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