C-修复递归中的堆栈溢出

C-修复递归中的堆栈溢出,c,exception,recursion,stack,overflow,C,Exception,Recursion,Stack,Overflow,C语言中的一段代码,使用分治法查找数组的最大值,但它会不断抛出 “堆栈溢出异常”。谢谢你的帮助 int a[10]; int find(int l,int h) { int x; if(h==0) { x=0; return x; } else { if(h==1) { if(a[0]>a[1]) {

C语言中的一段代码,使用分治法查找数组的最大值,但它会不断抛出 “堆栈溢出异常”。谢谢你的帮助

int a[10];
int find(int l,int h)
{
    int x;

    if(h==0)
    {
        x=0;
        return x;
    }
    else
    {
        if(h==1)
        {
            if(a[0]>a[1])
            {
                x=0;
                return x;
            }
            else
            {
                x=1;
                return x;
            }
        }
        else
        { 
            int mid,z,y;
            mid=(l+h)/2;
            y=find(0,mid);
            z=find(mid+1,h);
            if(a[y]<a[z])
            {
                x=z;
            }
            else
            {
                x=y;
            }
            return x;
        }
    }
}
inta[10];
整数查找(整数l,整数h)
{
int x;
如果(h==0)
{
x=0;
返回x;
}
其他的
{
如果(h==1)
{
如果(a[0]>a[1])
{
x=0;
返回x;
}
其他的
{
x=1;
返回x;
}
}
其他的
{ 
int-mid,z,y;
mid=(l+h)/2;
y=查找(0,中间);
z=查找(中间+1,h);

如果(a[y]考虑调用
find(0,2)
的情况。由于
h>1
,您输入第二个
else
子句,
mid
1
。然后在第二个递归调用中,它是
find(2,2)
。在这个递归调用中,您再次输入第二个
else
,因为
h
仍然是2。但是
mid
也是
2
。现在,第一个递归调用转到
find(0,2)
,它进入一个无限循环

find(0, 2)
   h not 0
       h not 1
           mid = 1
           find(0, 1)
           find(2, 2)
               h not 0
                   h not 1
                       mid = 2
                       find (0, 2) <-- loop

这是已修改的代码,正在成功运行。。 问题在于,您没有检查
l
h
之间的差异,而是只检查
h
的值

#include <iostream>
using namespace std;
int a[10];


int find(int l,int h)
{
int x;



if(h-l==0)
{

    return h;
}
else
{


    if(h-l==1)
    {
        if(a[l]>a[l+1])
        {

            return l;
        }
        else
            {

                return l+1;
            }
    }
    else
    { 
        int mid,z,y;
        mid=(l+h)/2;
        y=find(0,mid);
        z=find(mid+1,h);



        if(a[y]<a[z])
        {
            x=z;
        }
        else
        {
            x=y;
        }

        return x;
    }}}
int main()
{
a[0]=3;
a[1]=7;
a[2]=5;
cout<<find(0,2)<<endl;
return 0;
}
#包括
使用名称空间std;
INTA[10];
整数查找(整数l,整数h)
{
int x;
如果(h-l==0)
{
返回h;
}
其他的
{
如果(h-l==1)
{
如果(a[l]>a[l+1])
{
返回l;
}
其他的
{
返回l+1;
}
}
其他的
{ 
int-mid,z,y;
mid=(l+h)/2;
y=查找(0,中间);
z=查找(中间+1,h);

如果(a[y]使用了错误的条件,请尝试:

first if: if(h==l)

second if: if(h-l==1)

third if:  
      if(a[h]>a[l])  {
         return h;
      } else {
         return l;
      }

当代码<>0 < /代码>或<代码> 1 > /代码>时,是否停止所有的情况,如果没有,则将继续无限地重复。您的算法有点奇怪,考虑<代码> L=0 < /代码>和<代码> h=2 < /代码>:<代码> MID=(0 + 2)/2=1;y=查找(0,1);Z=查找(2,2)
-看起来是正确的,但是看看
查找(2,2)
将做什么:
mid=(2+2)/2=2;y=find(0,2)
我想这是一种尝试,用分而治之的方法来计算找到最大元素?是的,我的错。这是找到最大位置!@Alexandrubarbosie:
a
是提问者问题中的一个全局变量。它由
main
初始化。我的错,我没有注意到。删除我的答案。
#include <iostream>
using namespace std;
int a[10];


int find(int l,int h)
{
int x;



if(h-l==0)
{

    return h;
}
else
{


    if(h-l==1)
    {
        if(a[l]>a[l+1])
        {

            return l;
        }
        else
            {

                return l+1;
            }
    }
    else
    { 
        int mid,z,y;
        mid=(l+h)/2;
        y=find(0,mid);
        z=find(mid+1,h);



        if(a[y]<a[z])
        {
            x=z;
        }
        else
        {
            x=y;
        }

        return x;
    }}}
int main()
{
a[0]=3;
a[1]=7;
a[2]=5;
cout<<find(0,2)<<endl;
return 0;
}
first if: if(h==l)

second if: if(h-l==1)

third if:  
      if(a[h]>a[l])  {
         return h;
      } else {
         return l;
      }