| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2730 人关注过本帖
标题:【求助】c#二分法 确保不出现无限递归(初学)
只看楼主 加入收藏
xxx5
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-6-11
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
【求助】c#二分法 确保不出现无限递归(初学)
public  int Binsearch(int[] a, int key,int low, int high)
        {
            int mid = (low + high) / 2;
            if (mid > 1)
            {
                if (key < a[mid])
                { return Binsearch(a, key, low, mid-1 ); }
                else if (key > a[mid])
                { return Binsearch(a, key, mid+1 , high); }
                else if (key == a[mid])
                { return mid; }
                else { return -1 ; }
            }
            else return mid;
        }
运行以后,出现“未处理的“System.StackOverflowException”类型的异常出现在 期末样题.exe 中。”,还有“确保您没有无限循环或无限递归”。我已经写了 mid>1 ,为什么不能成功啊?还有我的初衷是要输入一个数字,利用二分法判断它是否在已知数组中。有没有更好的方法呢??

非常感谢好心人的帮助啊!!!我这是第一次提问。。。如果有什么不对的地方,麻烦指出来~~

搜索更多相关主题的帖子: 二分法 return public 
2013-06-11 20:35
QJlin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:186
专家分:560
注 册:2013-5-18
收藏
得分:0 
沒有循環這叫遞歸?

慢慢前进走,不求一步登天,只求慢慢前进
2013-06-11 21:03
xxx5
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-6-11
收藏
得分:0 
回复 2楼 QJlin
我觉得是有循环的啊。。。
2013-06-11 22:54
lxb932979339
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:84
专家分:313
注 册:2013-4-24
收藏
得分:0 
递归就是“循环(此循环非彼循环)”机制实现的,难道非要有for while 等等么,递归就是函数在一定条件下自身的调用,不满足那个条件的情况下,再逐级的“向上”执行未完成的代码行
2013-06-12 02:40
QJlin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:186
专家分:560
注 册:2013-5-18
收藏
得分:0 
以下是引用xxx5在2013-6-11 22:54:24的发言:

我觉得是有循环的啊。。。

你一个return就是结束了,跳出了哪里还有循环?

慢慢前进走,不求一步登天,只求慢慢前进
2013-06-12 11:50
xxx5
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-6-11
收藏
得分:0 
老师给的原题是:“编一二分法递归查找函数 BinSearch(a(),low, high,n,key)  对递减有序数组a中查找key值,查找到返回数组的下标,找不到返回-1。”因为我学得很烂,所以对概念什么的不是很清楚。所以能不能直接告诉我应该怎么做啊?简单一点的方法。。。
2013-06-12 18:55
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
收藏
得分:10 
程序代码:
class Program
    {
        static void Main(string[] args)
        {
            int[] a = new int[] { 3, 12, 24, 36, 55, 68, 75, 88 };
            Program p = new Program();
            //调用方法(数组a,查找75,起始下标0,结束下标为数组最后值的下标)
            int b = p.Binsearch(a, 75, 0, a.Length - 1);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="a">待查找数组,需有序排列,升降都可</param>
        /// <param name="key">待查找的值</param>
        /// <param name="low">数组起始下标</param>
        /// <param name="high">数组结束下标</param>
        /// <returns>待查找值的索引</returns>
        public int Binsearch(int[] a, int key, int low, int high)
        {
            if (low > high || high < 0)
            {
                return -1;
            }

            int mid = (low + high) / 2;

            if (key < a[mid])
            { 
                return Binsearch(a, key, low, mid - 1); 
            }
            else if (key > a[mid])
            { 
                return Binsearch(a, key, mid + 1, high); 
            }
            else
            { 
                return mid; 
            }

        }
    }
2013-06-12 21:32
ndwg2012
Rank: 2
等 级:论坛游民
帖 子:1
专家分:10
注 册:2013-6-13
收藏
得分:10 
public int Binsearch(int[] a, int key, int low, int high)
        {
            int temp=0;
            if (low > high || high < 0)
            {
                return -1;
            }

            int mid = (low + high) / 2;

            if (key < a[mid])
            {
                temp= Binsearch(a, key, low, mid - 1);
            }
            else if (key > a[mid])
            {
               temp=Binsearch(a, key, mid + 1, high);
            }
            else
            {
                temp=mid;
            }
            return temp;

        }
2013-06-13 12:48
yebanbaobei
Rank: 2
等 级:论坛游民
帖 子:20
专家分:14
注 册:2012-12-24
收藏
得分:0 
class Program
    {
        static void Main(string[] args)
        {
            int[] a = new int[] { 3, 12, 24, 36, 55, 68, 75, 88 };
            Program p = new Program();
            //调用方法(数组a,查找75,起始下标0,结束下标为数组最后值的下标)
            int b = p.Binsearch(a, 75, 0, a.Length - 1);
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="a">待查找数组,需有序排列,升降都可</param>
        /// <param name="key">待查找的值</param>
        /// <param name="low">数组起始下标</param>
        /// <param name="high">数组结束下标</param>
        /// <returns>待查找值的索引</returns>
        public int Binsearch(int[] a, int key, int low, int high)
        {
            if (low > high || high < 0)
            {
                return -1;
            }

            int mid = (low + high) / 2;

            if (key < a[mid])
            {
                return Binsearch(a, key, low, mid - 1);
            }
            else if (key > a[mid])
            {
                return Binsearch(a, key, mid + 1, high);
            }
            else
            {
                return mid;
            }

        }
    }
求版主讲解下递归思路
2013-06-13 19:33
eqviq
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-9-26
收藏
得分:0 
这 折半查找 ,递归很容易看得懂啊
首先
   if (low > high || high < 0)
            {
                return -1;
            }

是确保输入索引有效 或者是没有找到的情况
  int mid = (low + high) / 2;

是确定一个数组中间元素的索引。。
然后
            if (key < a[mid])
            {
                return Binsearch(a, key, low, mid - 1);
            }
            else if (key > a[mid])
            {
                return Binsearch(a, key, mid + 1, high);
            }
            else
            {
                return mid;
            }
就是对应的三种情况了。 1: 如果待查找的元素比数组中间的元素小 ,那么(此时递归)调用该方法本身的时候,新的“数组”的界限就变成了从low到mid-1 ,也就是“左半端”,然后一直找下去一直到找到了或者是low》high了(没招到,返回-1),方法体结束。 2 同理是右半段。 3就是恰好找到了,此时返回mid,该方法体结束。


2013-09-26 09:06
快速回复:【求助】c#二分法 确保不出现无限递归(初学)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037064 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved