黑马程序员技术交流社区

标题: 关于return递归的问题 [打印本页]

作者: 小楼一夜听春雨    时间: 2013-12-14 15:13
标题: 关于return递归的问题
本帖最后由 小楼一夜听春雨 于 2013-12-16 21:44 编辑

class Prog23
{
        public static void main(String[] args)
        {
                System.out.println(getAge(5,2));
        }
        private static int getAge(int m,int n)
        {
                if(m==n)
                        return 10;
                else
                        return getAge(m-1,n)+n;
        }
}
对递归这个意思始难以很好的理解,请高手帮忙解释下,递归的程序步骤是怎么样运行的,如果能画个图来形容下更好
作者: 小斥候    时间: 2013-12-14 15:26
本帖最后由 小斥候 于 2013-12-14 15:43 编辑

你就简单理解成函数调用函数本身你这个程序是这样:首先参数(5,2)
接下来,分解,简写(调用函数)
4,2)+2-》
3,2)+2+2-》
2,2)+2+2+2
直到最后m==n的时候,即2,2)+2+2+2,程序开始返回一个确切的数

220px-Droste.jpg (59.16 KB, 下载次数: 86)

图中的女子拿的杯子及纸盒上的图与整张图片相同.是德罗斯特效应的一个例子 ... ... ... ... ...

图中的女子拿的杯子及纸盒上的图与整张图片相同.是德罗斯特效应的一个例子 ... ... ... ... ...

作者: Diaraelo    时间: 2013-12-14 15:42
本帖最后由 Diaraelo 于 2013-12-14 15:45 编辑

递归就是   函数通过调用自己来实现一种需循环的功能,

其实很简单,比如IO中打开文件夹方法就是递归来实现的。

例:一个方法的内容是这样描述的:搜索给定的目录(参数),发现文件就取名字输出,发现文件夹取其目录。
伪代码如下:
public void  文件夹方法(给定的目录)

        if ( 发现是文件夹 )
        {        调用文件夹方法(传入这个文件夹的目录)    }//传入这个文件夹的目录这个动作实际上是在收缩
        else                                                                                //从大的目录进入到了小目录
           返回文件名字



如此实现打开所有子文件的目的,就叫递归
递归其实就2个关键,第一就是如何退出递归(就是递归出口的设计,一般就是收缩下一次的作用域,好像就是每次 i--  当 i =0时候就退出递归)
另外就是防止内存溢出,因为递归太过于庞大,不断在内存中建立方法就会造成内存溢出,必须小心。

作者: 回音    时间: 2013-12-14 15:44
递归程序分为递归调用和递归返回两个部分。
递归调用:
getAge(5,2)=getAge(4,2)+2;
getAge(4,2)=getAge(3,2)+2;
getAge(3,2)=getAge(2,2)+2;
getAge(2,2)=10;
递归返回:
getAge(2,2)=10;
getAge(3,2)=10+2;
getAge(4,2)=10+2+2;
getAge(5,2)=10+2+2+2;
自己画的哦,望采纳

recursion.png (16.74 KB, 下载次数: 92)

recursion.png

作者: hurryup    时间: 2013-12-14 16:21
1.递归原理
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合

递归思想的关键是:(1)递归出口;(2)递推逐步向出口逼近。

2.递归的条件:
   1.边界条件
   2.递归前进段
   3.递归返回段
    当边界条件不满足时,递归前进;当边界条件满足时,递归返回。


作者: 翼展哈哈    时间: 2013-12-14 18:14
楼主您好,递归简单通俗地说,就是自己调用自己,直至达到边界条件(在楼主提供的代码里,该边界条件就是 m == n)。在看递归代码时,你可以把递归部分理解成结果已求出,我是说理解的时候这样理解而不再去想递归部分是经过很复杂的过程之后才得到的结果!我觉得这样想,有助于加强对递归在当前状态下操作运行的理解。
      另外提供一下楼主代码的递归运算图。
该图很像数据结构中的树,执行过程按照编号由小到大一步步进行,楼主以后遇到递归题目时可以按照图示结果模仿程序的运行,我个人认为这样是比较的形象,有助于理解!
希望可以帮到楼主,有什么不对的,欢迎批评指正!

1.png (10.7 KB, 下载次数: 62)

递归运算图

递归运算图

作者: 冷月    时间: 2013-12-14 19:24
所谓递归,是指程序调用自身,当然,递归不会无休止地调用下去。递归必然是有出口的,当满足条件时程序也就结束了,否则,那就是死循环。
下面是几个递归的方法,希望对你有用
public class Recursion{
      //把一个十进制数转换成二进制数
      public static void DecimalToBinary(int num){
             if(num ==0){        //当num=0时,循环结束
                    return;
             }else{
                    DecimalToBinary(num/2);  //调用递归方法
                    System.out.print (num%2);
             }
             }
      
      //求1+2+...+100 的求和
      public static int sum(int num){
             if(num > 0){
                    return num + sum(num-1);
             }else{
                    return0;      //当num=0时,循环结束
             }
            
      }   
      
      //求两个数的最大公约数,用两个数的绝对值与这两个数较小的那个一直比较,直到相等为止。               
      public static void yueshu(int num1,int num2){
             if(num1 == num2){
                    System.out.println(num1);  //num1=num2时,结束
             }
             else{
                    yueshu(abs(num1-num2),min(num1,num2));
             }
                                 
      }
      
      //求两个数绝对值
      public static int abs(int num){
             return num>0 ? num : -num;
      }

作者: 小楼一夜听春雨    时间: 2013-12-16 21:42
谢谢各位大神的详细讲解,有些概念了{:soso_e183:}
作者: 还记得梦想吗    时间: 2013-12-17 00:02
1到10的和  函数调用自身。。。传入参数method(0);++后变成method(1);然后1调用2而调用3  直到小于10 while退出循环。。。
class B007
{
       
       
        public static void main(String[] args)
        {
               
                System.out.println(method(0));
        }
       
        static int method(int m)
        {
                int aa = 0;
               
                while(m<10)
                {
                        m++;
                        method(m);
                       
                        aa= aa + m;
                }       
               
                return aa;               
        }
}












欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2