0 0

关于递归调用的写法,遇到死循环吗,请教大家5

private String queryOrgDn(String parentid,String dn){
		System.out.println("parentid : " +parentid);
		int len = parentid.trim().length();
		while(len > 5) {
			AndFilter filter = new AndFilter();
			filter.and(new EqualsFilter("objectclass","uumOrg"));
			filter.and(new EqualsFilter("ESSPorgId",parentid));
			List<Org> alist = ldapTemplate_user.search("", filter.encode(),new OrgAttributeMapper());
			System.out.println("alist : " + alist.size());
			if(null!=alist&&0<alist.size()){
				Org _aorg = alist.get(0);
				String _parentid = _aorg.getESSPparentId();
				String _dn = dn + _aorg.getOu();
				queryOrgDn(_parentid,_dn);//@2
			}else break;
			
		}
		return dn;//@1
	}

我打断点调试过了,在运行到@1处后,程序又会回到@2处,然后@1,@2,@1,@2....陷入死循环。不是很懂递归调用,请指教!谢谢
2013年6月18日 17:27

7个答案 按时间排序 按投票排序

0 0

采纳的答案

感觉 while(len > 5)改成if(len > 5)

@2 处 应该是 return queryOrgDn(_parentid,_dn);//@2 

2013年6月18日 20:18
0 0

使用递归最重要的是要清楚退出的条件是什么,你的程序的退出条件为parentid<=5的时候,就会跳出此递归。所以你parentid的长度才是关键

2013年6月19日 14:16
0 0

int len = parentid.trim().length(); 
        while(len > 5) { ..... }

以上条件满足,并且下面的alist大于0的话就会陷入死循环,因为每次循环你都会重新new AndFilter(),在将and方法重新计算一遍。
AndFilter filter = new AndFilter(); 
filter.and(new EqualsFilter("objectclass","uumOrg")); 
filter.and(new EqualsFilter("ESSPorgId",parentid));

如果我没有理解或猜错的话,以下search方法始终会与上一次循环的计算结果相同。
List<Org> alist = ldapTemplate_user.search("", filter.encode(),new OrgAttributeMapper());

当alist每次都是相同的结果,并且大于0,此处会进入递归中,递归里面又重复执行上面说描述的满足条件计算,则会陷入无止的循环中,直到挂掉。
if(null!=alist&&0<alist.size()){
      ......
    queryOrgDn(_parentid,_dn);//@2 进入递归
}else break; //if条件满足的话,不会进入到break

你的方法传入的dn,在if 当中dn只是做为局部变量去和其它返回值组合,而dn本身的值没有发生变化,你的queryOrgDn()方法每次返回的值都会是你传入到参数dn,如果是计算数值的方法,你这个递归没什么意义
private String queryOrgDn(String parentid,String dn){
......
String _dn = dn + _aorg.getOu(); 
......
return dn;//@1
}

2013年6月19日 10:30
0 0

如果第一次传入的len满足len>5,同时(null!=alist&&0<alist.size())是true,程序自然而然的陷入死循环了,因为while不会退出。
所以最里层的len>5和(null!=alist&&0<alist.size())不同时为true的流程在一直被调用,出现lz说的a1和a2不停交替的情况。


2013年6月19日 09:36
0 0

@1完了回去执行@2,请注意这里可能参数已经变成第一次执行@2时的值了,就这样@2又回到@1,然后@1完了又回去执行@2...可以debug看看是不是我说的这样。

2013年6月19日 09:08
0 0

补充一下,因为运行到@1后,只是完成了最外层的方法体,还有很多递归造成的内存方法体未完成,也就是说有方法没有运行到@1这一步所以会出现这种死循环。

2013年6月18日 18:05
0 0

在实际项目中基本上很少用到递归,因为递归这种算法相当耗资源。至于你提到的问题,请debug参数_parentid,看看这个参数是不是每次运行到@2处都是变化的,并且满足_parentid.trim().length()> 5这个条件的,如果每次都满足这个条件请跟踪alist,看这个参数是否变化,是否满足条件null!=alist&&0<alist.size()。如果以上两点都满足说明进入死循环。简单一句话说就是,程序运行到@2后,递归调用自身方法,当再进入@2时再递归...所以下面的break和return形同虚设了。请在递归传参时多加考虑

2013年6月18日 17:52

相关推荐

    递归调用详解,分析递归调用的详细过程[参考].pdf

    在递归调用中,需要注意避免死循环的出现,需要在递归函数中加上return语句,以便终止递归下降过程。程序员还必须确保递归函数不会随意改变静态变量和全局变量的值,以避免在递归下降过程中的上层函数出错。 递归...

    VB6.0过程的递归调用

    - **效率低**:相比循环,递归通常执行速度较慢,因为每次调用都有一定的开销。 5. **注意事项** - **明确终止条件**:确保每个递归调用都有明确的终止条件,防止无限递归。 - **避免重复计算**:在某些情况下,...

    递归调用详解,分析递归调用的详细过程

    递归调用详解,代码详细讲解了如递归调用以及调用中应该注意的一些问题

    函数递归调用堆栈分析.doc

    函数递归调用堆栈分析 函数递归调用堆栈分析是指在计算机科学中,函数递归调用时,函数调用自身的过程中,如何使用堆栈来存储变量和参数的过程。堆栈是一种 lasts-in-first-out(LIFO)的数据结构,用于存储函数...

    C语言函数递归调用学习教案.pptx

    C语言函数递归调用学习教案 C语言函数递归调用是指在调用一个函数的过程中,出现直接或间接地调用该函数本身的现象。递归调用可以用来解决一些复杂的问题,但也需要注意递归调用的深度和性能问题。 函数的递归...

    一个简单的递归调用的实例

    在编程领域,递归是一种强大的概念,它是指函数或过程在执行过程中调用自身的行为。递归通常用于解决那些可以通过简化问题规模来求解的问题,尤其是处理数据结构如树或图时。在这个“一个简单的递归调用的实例”中,...

    插入排序递归非递归汇编写法

    "插入排序递归非递归汇编写法" 插入排序是常用的排序算法之一,它的时间复杂度为O(n^2),空间复杂度为O(1)。在本实验报告中,我们将使用MIPS汇编语言来实现插入排序,包括递归和非递归版本。 递归版本 在递归版本...

    3.7 函数的递归调用(ppt).pdf

    - **间接递归**:通过多个函数之间的相互调用来实现递归,即函数A调用函数B,函数B又调用函数A,形成一个循环链。 以阶乘为例,`fact`函数展示了如何使用递归调用来计算阶乘。当输入`n`为1或0时,返回1(因为0!和1...

    C语言函数递归调用PPT课件.pptx

    C语言函数递归调用PPT课件 函数的递归调用是指在调用一个函数的过程中,出现直接或间接地调用该函数本身的现象。例如,函数f调用函数f1,函数f1调用函数f2,函数f2调用函数f1,这样就形成了一个递归调用链。 递归...

    计算递归函数调用次数

    递归情况则是将问题规模减小并调用自身的过程,直到遇到基本情况为止。 例如,给定的题目要求我们计算Succ(n),这可能是一个递归定义的数学序列。假设Succ(n)的定义为Succ(n) = Succ(n-1) + 1,那么我们可以构建...

    C语言函数的嵌套调用和递归调用PPT课件.pptx

    C语言函数的嵌套调用和递归调用 本文主要介绍C语言函数的嵌套调用和递归调用,包括函数的递归调用、变量的作用域和存储类型等知识点。 函数的递归调用 函数的递归调用是指函数直接或间接地自我调用的一种调用方式...

    树的无限分级递归调用

    在本话题中,我们将深入探讨“树的无限分级递归调用”这一主题,特别关注如何在Visual Studio 2010环境下利用递归实现树的层级遍历。递归是一种函数或过程在其定义中直接或间接地调用自身的技术,常用于解决具有重复...

    C语言递归调用举例

    C语言递归调用举例,可直接复制粘贴。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...

    一个递归调用的存储过程

    在SQL中,创建递归存储过程涉及编写一个包含CASE语句、WHILE循环或者更常见的是使用递归公用表表达式(Recursive Common Table Expression, CTE)的结构。以下是一个简单的递归存储过程的概念示例: ```sql CREATE ...

    vue 组件递归调用

    vue组件递归调用,展示树状结构,

    java实现递归调用

    在编程领域,递归是一种强大的概念,它是指函数或过程在执行过程中调用自身的行为。在Java中,递归常用于解决需要重复执行相同任务但每次处理的数据不同的问题,例如遍历树形结构、计算阶乘、求解斐波那契数列等。本...

    C语言函数的嵌套调用和递归调用学习教案.pptx

    C语言函数的嵌套调用和递归调用学习教案.pptx

    算法进阶 01 递归调用 打表

    在编程领域,算法是解决问题的关键,而递归调用是算法设计中的一种重要技术。递归调用是指函数或方法在执行过程中调用自身的过程,它通常用于解决那些可以通过简化问题规模来解决的问题。本节将深入探讨递归调用的...

    32位无符号乘法/递归调用程序

    该程序通过一系列汇编指令实现了32位无符号乘法的计算,并通过递归调用子程序的方式输出计算结果。通过对输入输出、数据处理及计算逻辑的详细解析,我们不仅可以了解该程序的具体工作原理,还能学习到如何使用汇编...

    使用c语言实现递归调用, 主要考察递归调用

    ### 使用C语言实现递归调用 #### 一、递归的基本概念 递归是一种算法设计方法,在这种方法中,函数直接或间接地调用自身。递归通常用于解决那些可以分解为更小规模同类问题的问题。一个递归算法通常包含两个部分:...

Global site tag (gtag.js) - Google Analytics