除法函数返回错误的值
Divide function returns wrong value
我有一个函数,据说它会检查是否有索引i
,使其等于v[i]
。V
是一个严格的升序有序向量。这需要在O(logn)
中完成,我想到了分裂。我从来没有真正熟悉递归。我写了这段代码,我真的不知道为什么它不起作用。有些东西不见了。如果我输入cout << mid
而不是返回,它将显示正确的值,但坦率地说,我想这不是正确的方法。在此阶段,返回的中间值是 7,我不知道为什么。
这是代码。
int customDivide(vector <int>& v, int left, int right)
{
if(left <= right)
{
int mid = (left+right)/2;
if(mid == v[mid]){
//cout<<mid<<" ";
return mid;
}
customDivide(v,left,mid-1);
customDivide(v,mid+1,right);
}
}
这里存在两个问题,我将尝试用在附近找到一只迷路的狗来解释它们。
-
您不会从函数返回值,除非您立即找到正确的元素。你承诺返回一个值(一个
int
(,但你并不总是这样做。这就像承诺给狗主人发一封信,说明在哪里可以找到他们丢失的狗。你检查你的花园,如果你找到狗,你寄一封信 - 有效。如果你没有找到狗,你去找你的邻居,让他们承诺如果他们找到狗,他们会给你写一封信,使用与你相同的方法(递归(。问题是,在这种情况下,您不是在阅读或转发它们的字母(最后两个递归函数调用的返回值( -您只是扔掉这些字母。更糟糕的是,如果你自己没有找到它(没有
return
打电话后(,你实际上并没有把信寄回给寻找他的狗的人。您的代码似乎假设邻居会自动将信件发送给狗主人 - 这不是return
的工作方式,它只是将字母发送给链中的前一个人(在代码术语中,调用堆栈(,所以如果那个人立即将其扔进垃圾桶,系统将无法工作。 -
如果您无条件地递归于两端,则无法获得 O(log(n(( 性能。
如果你总是问你所有的邻居(他们问他们所有的邻居(,你几乎会让附近的每个人都在寻找狗。那是O(n(。你必须确定你的两个邻居中的哪一个应该寻找狗(例如,通过查看狗留下的痕迹(,并且只问那个。通过这种方式,您将每一步可能需要搜索狗的人数减半,从而为您提供 O(log(n(( 性能。
这条"线索"是您需要事先知道的。在您的情况下,不清楚这可能是什么 - 狗可能在任何地方(所有元素都可以有随机值(,您不知道去哪里寻找。你需要弄清楚任务的这个细节才能到达你的O(log(n((时间。可能是矢量元素严格增加(参见@Jarod42的评论(,即没有重复的元素,每个元素都比前一个大。在这种情况下,您可以决定剩下的两半中只有一半可以包含您要查找的内容,从而在那里递归。
(是的,我知道,除非你的邻居形状像一棵二叉树,你位于顶部,并且对"邻居"有一个非互惠的定义,否则这个类比就会被打破。
由于这里涉及的所有帮助,我终于明白了问题所在。
- 首先 - 它没有利用向量被严格排序的事实。
- 2nd - 堆栈中的每个函数现在都返回一些东西。
int customDivide(vector <int>& v, int left, int right)
{
if(left <= right)
{
int mid = (left+right)/2;
if(mid == v[mid])
return mid;
else if(v[mid] < mid)
return customDivide(v,mid+1,right);
else
return customDivide(v,left, mid-1);
}
return -1;
}
非常感谢您的帮助!
- (C++)分析树以计算返回错误值的简单算术表达式
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- C++中函数的向量返回类型引发错误
- 有人知道为什么在开关中使用stoi函数会返回恒定的错误吗
- glad 导致 glfwSwapBuffers 返回错误消息
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- QNX Momentics: GoogleMock - 返回有价值,在函数中返回 void 错误
- 我的模板类方法返回错误类型?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 替换WCHAR_T错误返回存储地址
- 错误:void 值未被忽略,因为它应该被忽略,错误:返回语句具有值
- 带有值的递归阶乘错误返回语句,在函数中返回 'void' [-fallowive]
- 存储在静态常量整数 (C++) 中的对数函数的错误返回值
- 更丰富的错误返回消息用于提升::精神::qi 解析
- C++初级逻辑错误-返回0
- 由于进程很多,pthread_create的错误返回代码是 35 错误,我用过pthread_exit应该杀死线程不是吗?
- c++错误处理返回值错误返回
- systememerror:没有异常集的错误返回