您的位置:首页 > 职场人生

黑马程序员——Java基础---递归

2015-11-29 18:04 344 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!                         递归

Java支持递归。

递归是根据自身定义内容的过程。就java编程而言,递归是一个允许方法调用自身的特征。

调用自身的方法被称为递归方法。

递归的典型例子是阶乘的计算。N的阶乘是从1到N之间所有整数的乘积。

例如:3的阶乘是1*2*3,也就是6。

下面显示了使用递归方法计算阶乘的原理。

//一个简单递归的例子

class Factorial{

//这是一个递归的方法

int fact(int n){

int result;

if(n==1){

return 1;

}else {

result = fact(n-1)*n;

return result;

}

}

}

public class Recursion {

public static void main(String[] args) {

Factorial f = new  Factorial();

System.out.println("3的阶乘是"+f.fact(3));

System.out.println("4的阶乘是"+f.fact(4));

System.out.println("5的阶乘是"+f.fact(5));

}

}


当方法调用自身时,在堆栈上为新的局部变量和参数分配内存,并且使用这些

新的变量从头开始执行方法的代码。当每次递归调用返回时,将老的局部变量

和参数从堆栈中移除,并将执行控制代码恢复到内部的调用点。

递归的方法被称为”望远镜式”的方法,可以自由伸缩。

许多例程的递归版本,他们的执行速度比与之等价的迭代版本要更慢一些,因为

增加了额外的函数调用负担。对方法进行大量的递归调用可能会导致堆栈溢出。

因为参数和局部变量存储在堆栈中,并且每次新的调用都会创建这些变量的副本。所以可能会耗尽堆栈。

如果发生这种情况,java运行时系统会产生一个异常。但是,除非野蛮的运行

递归,否则不必担心这个问题。

递归方法的主要优点是,对于某些算法,使用递归可以创建出比迭代版本更清晰

并且更简单的版本。

当编写递归方法时,在某个地方必须有一条if语句,用于强制方法返回而不在执行递归调用。

如果没有这么做,一旦调用该方法,就永远不会返回。这是使用递归时很常见的一个错误。在开发期间可以随意使用println()语句,从而可以观察将要执行的操作,并且如果发现错误,可以终止执行。

下面是另外一个递归的示例。递归方法printArray() 打印数组values中的前i个元素。

class RecTest{

int values[];

RecTest(int i){

values = new int[i];

}

void printArray(int i){

if(i==0){

return;

}else {

printArray(i-1);

System.out.println("["+(i-1)+"]"+values[i-1]);

}

}

}

public class Recursion2 {

public static void main(String[] args) {

RecTest ob = new RecTest(10);

int i;

for (i = 0;  i<10; i++) {

ob.values[i] = i;

ob.printArray(10);

}

}

}


-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: