除法函数返回错误的值

Divide function returns wrong value

本文关键字:错误 返回 函数 除法      更新时间:2023-10-16

我有一个函数,据说它会检查是否有索引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);
}
}

这里存在两个问题,我将尝试用在附近找到一只迷路的狗来解释它们。

  1. 您不会从函数返回值,除非您立即找到正确的元素。你承诺返回一个值(一个int(,但你并不总是这样做。

    这就像承诺给狗主人发一封信,说明在哪里可以找到他们丢失的狗。你检查你的花园,如果你找到狗,你寄一封信 - 有效。如果你没有找到狗,你去找你的邻居,让他们承诺如果他们找到狗,他们会给你写一封信,使用与你相同的方法(递归(。问题是,在这种情况下,您不是在阅读或转发它们的字母(最后两个递归函数调用的返回值( -您只是扔掉这些字母。更糟糕的是,如果你自己没有找到它(没有return打电话后(,你实际上并没有把信寄回给寻找他的狗的人。您的代码似乎假设邻居会自动将信件发送给狗主人 - 这不是return的工作方式,它只是将字母发送给链中的前一个人(在代码术语中,调用堆栈(,所以如果那个人立即将其扔进垃圾桶,系统将无法工作。

  2. 如果您无条件地递归于两端,则无法获得 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;
}

非常感谢您的帮助!