黑马程序员——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。
下面显示了使用递归方法计算阶乘的原理。
当方法调用自身时,在堆栈上为新的局部变量和参数分配内存,并且使用这些
新的变量从头开始执行方法的代码。当每次递归调用返回时,将老的局部变量
和参数从堆栈中移除,并将执行控制代码恢复到内部的调用点。
递归的方法被称为”望远镜式”的方法,可以自由伸缩。
许多例程的递归版本,他们的执行速度比与之等价的迭代版本要更慢一些,因为
增加了额外的函数调用负担。对方法进行大量的递归调用可能会导致堆栈溢出。
因为参数和局部变量存储在堆栈中,并且每次新的调用都会创建这些变量的副本。所以可能会耗尽堆栈。
如果发生这种情况,java运行时系统会产生一个异常。但是,除非野蛮的运行
递归,否则不必担心这个问题。
递归方法的主要优点是,对于某些算法,使用递归可以创建出比迭代版本更清晰
并且更简单的版本。
当编写递归方法时,在某个地方必须有一条if语句,用于强制方法返回而不在执行递归调用。
如果没有这么做,一旦调用该方法,就永远不会返回。这是使用递归时很常见的一个错误。在开发期间可以随意使用println()语句,从而可以观察将要执行的操作,并且如果发现错误,可以终止执行。
下面是另外一个递归的示例。递归方法printArray() 打印数组values中的前i个元素。
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
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学习型技术博客、期待与您交流!------------
相关文章推荐
- 黑马程序员——Java基础---单例
- 黑马程序员——Java基础---面向对象之抽象
- 黑马程序员——Java基础---面向对象之多态
- 面试题16:反转链表
- 前端笔试面试中的常用知识点总结(CSS)
- 扬州工业职业技术学院
- 五百强各大行业简介+面试流程+tips
- 扬州工业职业技术学院
- 面试时应该如何进行自我介绍呢
- 面试题15、输入一个链表,输出该链表中倒数第k个结点。
- 海量数据处理
- 一个java程序员自学IOS开发之路(十)
- 求职应聘时面试常见问题2
- 求职应聘时面试常见问题1
- 程序员自学的那些事
- 每个程序员都应该了解的 CPU 高速缓存
- 英语四级-面对让我备受挫折、不断回避、留有心结的考验
- 黑马程序员—Java基础—正则表达式
- 程序员技术练级攻略
- 谈谈Java程序员进阶的那些知识和方向