关闭

java recursive call 递归调用

标签: java递归
454人阅读 评论(0) 收藏 举报
分类:

java recursive call 递归调用

Question:

有一个父子关系的机构List,其中需要找到某个机构返回出来。每一个元素有标识:number 代表本身机构号、 parent是父机构号、children是子元素列表

Solution:

根据思考如果使用递归,有两种解决办法:

  1. 使用遍历的办法
    在这个list上,逐个获取元素,如果这个元素有子children,那么就需要获取子children并进行循环,遍历所有元素及children,直到找到我们所需要的机构位置.
  2. 使用按关系查找方法
    1. 假设要找的机构是curOrgan,那么我们查找list,如果本身不包含,那么就将curOrgan的父元素传进去,直到找到这个父节点未知。如果我们在这里找到的就是curOrgan,那么就需要退出
    2. 将查找到的父元素的children以list的参数传进去,重新以curOrgan进行查找。
    3. 将找到的organ return出来,作为最后的return;

第一种方法很普通,就略去。第二种我们看到需要有一个不变的参数curOrgan,还需要一个变动的参数,以curOrgan进行变化,还需要一个list.

coding:

private Organization getOrgan(Organization loopOrgan, List<Organization> list, String curOrgan){
    //省略list为null或者空的判断
    boolean flag = false;
    Organization findOrgan = null;
    for(Organizaiton organ : list){
        if(organ.getNumber().equals(loopOrgan.getNumber()){
            flag = true;
            if(organ.getNumber().equals(curOrgan){ 
                return organ;
            }else{
                loopOrgan = organ;
                break;
            }
        }

    }
    if(!flag){
        findOrgan = getOrgan(loopOrgan.getParent(), list, curOrgan);
    }else{
        findOrgan = getOrgan(getOrgan(curOrgan), loopOrgan.getChildren(), curOrgan);
    }

    return findOrgan;
}

summary:

对于递归思维,自己仍然是不很熟悉,尤其是逆向递归。这个问题最初自己想要两个变量来解决,但是发现没有办法决定跳出点,包括以后的思路也是决定不好跳出点,所以花了很长时间。要理解递归的关键是: 1.每次循环的操作都是相同的 2.跳出点不能是每次会产生变化的量,应该是一个常量或者不因循环变化的变量,并且需要唯一。否则就跳出来就是错误的结果。 如果同学有相关的递归好的资料或练习题,可不可以发给我一下,谢谢。yongkangchn@126.com.

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

什么时候会发生回调(recursive calls)

recursive calls并不仅仅发生在解析的时候。由于数据字典记录了所有对象的结构、数据信息,因此在对象结构(如dba_tables、dba_objects)、数据发生变化(如统计信息的视图、段视图dba_segments(即占用空间会变化))时都会访问数据字典 1.1.4.2....
  • haiross
  • haiross
  • 2014-11-26 11:12
  • 2384

终于解决 归递调用 警告,其实程序没有 归递调用*** WARNING L13: RECURSIVE CALL TO SEGMENT

## 终于解决 归递调用 警告,其实程序没有 归递调用*** WARNING L13: RECURSIVE CALL TO SEGMENT> 引用块内容> http://blog.csdn.net/avideointerfaces/article/details/326878...
  • tanzhwen
  • tanzhwen
  • 2017-03-16 13:06
  • 980

尾调用(Tail Call)和尾递归(Tail Recursive)

Tail Call(尾调用)是指在调用函数时直接将被调函数的返回值作为调用函数的返回值返回。如果这个调用是调用了调用函数本身(递归调用),这叫做Tail Recursive(尾递归)。使用尾调用的一个优点在于它不消耗额外的调用栈空间,它可以替换当前的栈帧。因此,使用尾调用来替换标准的调用被称作Tai...
  • ps_e_udo
  • ps_e_udo
  • 2010-10-31 09:57
  • 7084

Go实战--go中函数递归(recursion)的使用(The way to go)

生命不止,继续 go go go !!!什么是递归 Technically, a recursive function is a function that makes a call to itself. To prevent infinite recursion, you need an if-...
  • wangshubo1989
  • wangshubo1989
  • 2017-06-20 10:56
  • 10189

终于解决 归递调用 警告,其实程序没有 归递调用*** WARNING L13: RECURSIVE CALL TO SEGMENT

## 终于解决 归递调用 警告,其实程序没有 归递调用*** WARNING L13: RECURSIVE CALL TO SEGMENT> 引用块内容> http://blog.csdn.net/avideointerfaces/article/details/326878...
  • tanzhwen
  • tanzhwen
  • 2017-03-16 13:06
  • 980

什么时候会发生回调(recursive calls)

recursive calls并不仅仅发生在解析的时候。由于数据字典记录了所有对象的结构、数据信息,因此在对象结构(如dba_tables、dba_objects)、数据发生变化(如统计信息的视图、段视图dba_segments(即占用空间会变化))时都会访问数据字典 1.1.4.2....
  • haiross
  • haiross
  • 2014-11-26 11:12
  • 2384

Oracle Recursive Calls 说明

一.  Recursive Calls 说明在执行计划的统计信息里有如下信息: SYS@anqing2(rac2)> set autot trace statisticsSYS@anqing2(rac2)> select * from ta,tb where ta.i...
  • tianlesoftware
  • tianlesoftware
  • 2011-06-22 17:15
  • 9993

C51的再入函数 reentrant RECURSIVE CALL TO SEGMENT

重入函数,又叫再入函数,是一种可以在函数体内不直接或间接调用其自身的一种函 数。 再入函数可被递归调用,无论何时,包括中断函数在内的任何函数都可以调入。再入 函数在 C51编译时使用的是模拟栈。 函数说明: 函数名(形式参数表) reentrant 注意事项: 1、再入函数不能传递bi...
  • husion01
  • husion01
  • 2012-12-27 13:57
  • 2436

尾递归(tail-recursive)

1.释义 2.例子
  • u012689588
  • u012689588
  • 2014-06-06 13:41
  • 1124

一些值得问问题的js代码小片段

你会用typeof f*ck = ‘object’来判断是否是对象吗?你有何高见?显然如果f*ck是个数组的话,typeof也会返回true,应该用的是 object.prototype.tostring.call(f*ck) === 'object Object'; //retu...
  • wmwmdtt
  • wmwmdtt
  • 2017-03-04 17:30
  • 467
    个人资料
    • 访问:122481次
    • 积分:2959
    • 等级:
    • 排名:第13824名
    • 原创:151篇
    • 转载:32篇
    • 译文:24篇
    • 评论:15条
    文章分类
    最新评论