数据结构,查找,递归的问题

照样是一个比较细枝末节的问题,上图!

图片说明

参数表的情况是这样的:Table T是一个数组,KeyType K是想要查找的数字,int low是数组的区间最小值,int high就是数组区间的最大值。



这是折半查找法,用了递归



这一段代码的问题就是如果想查找后半部分的数字,会陷进递归里面跳不出来,具体的问题因为在下能力不足,描述不出来呀~真的很抱歉。拜托大神稍稍花些精力看吧~十分感谢十分感谢十分感谢。



如果光看这一段代码看不明白,以下是全部代码

 #include<iostream>
#define MAXNUM 30
using namespace std;
typedef int KeyType;
typedef int InfoType;

//构建元素类型
typedef struct
{
    KeyType key;
    InfoType i;
}ElemType;
//构建顺序表类型
typedef struct
{
    ElemType *R;
    int length;
}Table;

//折半查找法
int BinarySearch(Table T, KeyType K, int low, int high)
{
    int mid;
    while (low <= high)
    {
        mid = (low + high) / 2;
        if (K == T.R[mid].key)
            return mid;
        else
            if (K < T.R[mid].key)
                BinarySearch(T, K, low, mid - 1);
            else BinarySearch(T, K, mid + 1, high);
    }
    return 0;
}

void main()
{
    Table T;  //构建顺序表T
    T.R = new ElemType[MAXNUM];  //为顺序表构建空间
    KeyType K;
    cout << "输入即将输入的元素数量(大于8个)" << endl;
    cin >> T.length;
    while (T.length <= 8)
    {
        cout << "小于8个,请重新输入" << endl;
        cin >> T.length;
    }

    cout << "请有序输入元素" << endl;
    for (int i = 1; i <= T.length; i++)
        cin >> T.R[i].key;

    cout << "希望查找的元素为" << endl;
    cin >> K;

    int low = 1; 
    int high = T.length; 
    int result;
    result = BinarySearch(T, K, low, high);   //调用函数
    if (result == 0)
        cout << "希望查找的元素不在此数组内" << endl;
    else cout << "该元素的下标为:" << result << endl;
    system("pause");
}

用了递归就不需要再用循环了,如果查找的数在后半段始终有low>high,因为在你的循环中始终没有改变low和high的值,所以循环不能结束。
这是一个使用递归的
int BinSearch(int Array[],int low,int high,int key)
{
if (low<=high)
{
int mid = (low+high)/2;
if(key == Array[mid])
return mid;
else if(key return BinSearch(Array,low,mid-1,key);
else if(key>Array[mid])
return BinSearch(Array,mid+1,high,key);
}

这是一个使用循环的
int BinSearch(int Array[],int SizeOfArray,int key)
{
int low=0,high=SizeOfArray-1;
int mid;
while (low<=high)
{
mid = (low+high)/2;
if(key==Array[mid])
return mid;
if(key high=mid-1;
if(key>Array[mid])
low=mid+1;
}
return -1;
}

用if 也不行,也是死循环或者递归
因为
只要找不到
low<=high 永远成立
除非找得到

用if 也不行,也是死循环或者递归
因为
只要找不到
low<=high 永远成立
除非找得到

自己写一个序列,然后按照你的程序手动运行一下