| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 720 人关注过本帖
标题:求讲解下递归的思路。
只看楼主 加入收藏
yebanbaobei
Rank: 2
等 级:论坛游民
帖 子:20
专家分:14
注 册:2012-12-24
结帖率:66.67%
收藏
已结贴  问题点数:10 回复次数:6 
求讲解下递归的思路。
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 20:19
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
收藏
得分:10 
首先说二分法,以升序数组为例,就是数组中的数从小到大排序
1 数组中取中间那个数,判断跟要找的数是大还是小,中间的数大于要找的数,那么要找的数就在数组的前半段;否则要找的数就在数组的后半段
2 取数组的一半(要么前半段,要么后半段),按1的方式继续找,直到找到

由此可以看出,每一次查找,所用的方式都是一样的,重复相同的方法,只是待查找的数组在慢慢缩小,这里是用下标去改变数组的大小

既然每次所用的方式是一样的,那么,在程序中同一个方法就可以完成任务,只是每一次传进去的数组不一样而已,也就是参数会有变化,但方法是同一个方法

那么,程序中判断到数组在前半段或是后半段之后,调用同样的方法,参数变一下,就可以完成下一次的查找,一直到找到结果

程序的关键在于设定跳出循环的条件

-----------------------
本身自己调用自己,是个无限的循环,但是设定了退出条件,就不是无限循环了

举个再简单一点的例子
private int FindNum(int num)
{
    if(num <= 0)
    {
        return 0;
    }
    else
    {
        return FindNum(num - 1);
    }
}

调用该方法int i = FindNum(2);
程序判断num不是0,进入else ,继续调用FindNum方法,参数变成了2-1,也就是FindNum(1),然后继续进入else,调用FindNum,参数变为0,接着就返回了0

如果把上面例子的递归写成正常的语句,就能看出递归的执行过程
private int FindNum(int num)
{
    if(num <= 0)
    {
        return 0;
    }
    else
    {
        return num - 1;
    }
}
调用int i = FindNum(FindNum(FindNum(2)));

[ 本帖最后由 yhlvht 于 2013-6-14 00:33 编辑 ]
2013-06-14 00:29
csharpluntan
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:7
帖 子:197
专家分:1122
注 册:2013-4-24
收藏
得分:0 
2楼,受教。

投之以桃,报之以李
2013-06-14 09:02
QJlin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:186
专家分:560
注 册:2013-5-18
收藏
得分:0 
其實你上個貼的8樓的可能對你理解更容易!

慢慢前进走,不求一步登天,只求慢慢前进
2013-06-14 09:21
yebanbaobei
Rank: 2
等 级:论坛游民
帖 子:20
专家分:14
注 册:2012-12-24
收藏
得分:0 
我只要是不会控制出口。每次都是死循环。 感谢版主。。
2013-06-14 18:37
may大象
Rank: 2
等 级:论坛游民
帖 子:55
专家分:38
注 册:2013-5-30
收藏
得分:0 
好棒,又学到了有用的

                             凡成大事者,各有各的方法论。
2013-06-15 14:50
lzj12530
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:264
专家分:841
注 册:2013-3-28
收藏
得分:0 
递归要求以相同的原理来处理程序,但是必须要有递归出口,如果没有出口就不能使用递归

C++菜鸟
2013-06-17 08:19
快速回复:求讲解下递归的思路。
数据加载中...
 
   



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

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