0 0

sbPre这个变量在递归的过程中,是怎么变化的?10

import java.sql.*;

public class ArticleTree {

	public static void main(String[] args) {
		new ArticleTree().show();
	}
	
	private void show(){
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager
			.getConnection("jdbc:mysql://localhost/bbs?user=root&password=root");
			stmt = conn.createStatement();
			rs = stmt.executeQuery("select * from article where pid=0");
			while(rs.next()){
				System.out.println(rs.getString("cont"));
				tree(conn,rs.getInt("id"),1);
			}			
		} catch (ClassNotFoundException e) {			
			e.printStackTrace();
		} catch (SQLException e) {			
			e.printStackTrace();
		} finally {
			try {
				if (conn != null){
					conn.close();
					conn = null;
				}
				if (stmt != null){
					stmt.close();
					stmt = null;
				}
				if (rs != null){
					rs.close();
					rs = null;
				}
			} catch (SQLException e) {				
					e.printStackTrace();
			}			
		}
		
	}

	
	private void tree(Connection conn,int id,int level) {
		Statement stmt = null;
		ResultSet rs = null;
		String str = "select * from article where pid =";
		StringBuffer sbPre = new StringBuffer("");
		for(int i=0;i<level; i++){
			sbPre.append("    ");
		}
		try {
			stmt = conn.createStatement();
			rs = stmt.executeQuery(str + id);
			while(rs.next()){
				System.out.println(sbPre + rs.getString("cont"));
				if(rs.getInt("isleaf") != 0){
					tree(conn,rs.getInt("id"),level+1);
				}
			}
		} catch (SQLException e) {
			
			e.printStackTrace();
		} finally {
			try {
				if(rs != null) {
					rs.close();
					rs = null;
				}
				if(stmt != null) {
					stmt.close();
					stmt = null;
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}		
		
		 
		
		
	}

}
下图是article这张表的数据和结构:
下图是程序执行的输出结果:

 

2009年12月27日 16:06
  • 大小: 28.3 KB
  • 大小: 8.3 KB

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

0 0

采纳的答案


首先,你的sbPre是在tree方法中的局部变量,每一次递归tree方法时,
          StringBuffer sbPre= new StringBuffer("");
上面这条语句表明,sbPre都是一个新的局部对象。与上一次执行tree方法时的sbPre是不一样的。上一次执行的sbPre可能已经被垃圾回收了。


因此,sbPre只会因这个循环而变化,level是多少,就append多少次。
for(int i=0;i<level; i++){ 
      sbPre.append("    ");
}

现在说说level,这个变量确实是在递归的。
if(rs.getInt("isleaf") != 0){ 
     tree(conn,rs.getInt("id"),level+1); 

这段代码表明,如果有叶子,level将继续加下去,因此sbPre会缩进的更多。
不过由于level是基本数据类型,形参和实参是传值并不是传址。所以每一次递归的tree方法中的level都可以看成不同的变量。因此,这样递归的level完全可以表示树的层次。

打印的结果完全是正确的,LS说的不对。

2009年12月29日 10:27
0 0

while(rs.next()){  
   System.out.println(sbPre + rs.getString("cont"));  
   if(rs.getInt("isleaf") != 0){  
       tree(conn,rs.getInt("id"),level+1);  
   }  
}
核心代码就这是这些。
但是令我奇怪的是,你的输出结果???这段代码不可能输出这样的结果啊。

2009年12月28日 10:40

相关推荐

    408函数-递归调用-全局变量和局部变量

    例如,计算阶乘的递归函数就需要设定一个基础情况(通常是`n = 0`或`n = 1`),并在每次递归调用时逐步接近这个基础情况。 #### 五、变量的作用域与生存周期 1. **局部变量与作用域**:局部变量的作用域仅限于定义...

    11 递归:如何利用递归求解汉诺塔问题?.mp4

    11 递归:如何利用递归求解汉诺塔问题?.mp4

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

    递归之所以能实现,是因为函数的每个执行过程都在栈中有自己的形参和局部变量的拷贝,这些拷贝和函数的其他执行过程毫不相干。 在递归调用中,系统将把调用者的所有实参和返回地址压入到栈中,栈指针将移到合适的...

    27丨递归树:如何借助树来求解递归算法的时间复杂度?1

    在递归算法中,我们通常将大问题分解为小问题来解决,这个过程可以抽象成一棵树的结构,即递归树。 递归树的节点代表递归调用,而边则表示这些调用之间的关系。在斐波那契数列的例子中,每个节点表示一个待解决的...

    第8课变量过程与递归过程[归纳].pdf

    第8课变量过程与递归过程[归纳].pdf

    一个递归调用的存储过程

    在给定的标题“一个递归调用的存储过程”中,我们可以推测这个存储过程利用了递归机制来解决某个问题。 描述中提到的博文链接指向了iteye博客的一个条目,尽管具体内容没有提供,但我们可以假设它会详细解释如何...

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

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

    存储过程递归查询

    2. **递归步**:递归过程中的核心部分,通过与递归基连接的方式逐步扩展结果集。 3. **连接条件**:用于确定递归步中如何与递归基进行关联,通常是根据父节点与子节点的关系进行匹配。 #### 六、递归查询的应用场景...

    编译原理递归下降实验和报告

    在本实验中,目标是理解和应用递归下降分析法来构建一个能够分析特定文法的程序,对任意输入的符号串进行有效性验证。 **一、实验目的** 实验的主要目的是通过实际操作,加深对递归下降分析法的理解,以及如何根据...

    C#递归 C#递归 C#递归

    这个方法首先定义了一个SQL查询语句来获取数据源,然后使用`ExecuteDataTable`方法执行SQL查询并将结果存储在`DataTable`对象`dt`中。 接下来,方法创建了一个`DataView`对象`dv`并设置其过滤器为`byte=0`,这意味...

    递归算法与非递归转化

    尾递归是指在递归算法中,递归调用语句只有一个,而且是处在算法的最后。当递归调用返回时,是返回到上一层的调用点,而不是返回到初始调用点。 间接转换法使用栈保存中间结果,将递归调用转换为循环结构。这种方法...

    VB6.0过程的递归调用

    递归调用是指在执行一个过程或函数时,该过程或函数又在其内部直接或间接地调用自身。这种调用方式可以解决某些复杂问题,如树遍历、分治策略和动态规划等。下面我们将深入探讨VB6.0中递归调用的原理、实现方法、优...

    TIA博途中临时变量Temp的基本概念解析.docx

    这些变量在声明时由操作系统动态分配内存空间,这个空间仅在当前块执行期间有效。一旦块执行完毕,操作系统会回收这个空间,释放内存。因此,Temp变量的生命周期与调用它的块紧密相关。 在递归调用的情况下,例如一...

    递归与迭代算法及其在JAVA语言中的应用.pdf

    递归与迭代是算法设计中两种常见的解决问题的方法,它们在Java语言中的应用广泛且具有深远的意义。递归算法通过方法内部调用自身来解决问题,它适合于可以分解为相似子问题的问题;而迭代算法则通过循环结构,不断...

    ackermann函数的递归实现和非递归实现

    递归实现的关键在于理解这个过程如何逐层展开。每次调用`A(m, n)`时,如果`m`或`n`不满足基础情况,就会继续调用自身,直到达到基础情况为止。这种递归深度可以迅速增长,使得阿克曼函数在较高的参数值上计算起来...

    ACM基础算法之递归

    在这个程序中,递归函数的限制条件就是变量quotient为零。在每次递归调用之前,我们都把quotient除以10,所以每递归调用一次,它的值就越来越接近零。当它最终变成零时,递归便告终止。 递归是如何帮助我们以正确的...

    读懂C++递归程序

    C++递归程序的概念及其执行过程 递归是计算机科学中的一个核心概念,它是一种解决复杂问题的方法...通过仔细分析递归调用的每一步,我们可以更加深入地理解递归的工作机制,并在未来的编程实践中更好地运用这一技术。

    使用C++,请给出此题的递归算法及非递归算法。

    在这个版本中,我们初始化一个变量`result`为1,然后通过循环乘以从2到`n`的所有整数,最终得到阶乘的结果。这种方法不需要存储额外的调用栈,通常更有效率。 递归和非递归算法的选择取决于问题的特性、性能需求...

    程序设计中递归算法

    在这个例子中,`inorderTraversal`函数首先递归地遍历左子树,然后访问根节点,最后递归地遍历右子树。 #### 五、递归算法的执行过程 递归算法的执行过程主要依赖于系统提供的栈结构来实现。在回溯阶段,每次递归...

    迭代与递归的区别

    例如,在计算累加和的场景中,如果当前的迭代变量值是s,下一个迭代变量值可能是s加上序列中的下一个元素。 迭代过程的控制指的是算法的停止条件,即决定何时结束循环。在大多数情况下,我们需要知道迭代次数或者...

Global site tag (gtag.js) - Google Analytics