转(Java中的递归思想)

解释:程序调用自身的编程技巧叫做递归。

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

递归的三个条件:

边界条件

递归前进段

递归返回段

当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

下面通过两个示例程序来说明:

使用Java代码求5的阶乘。(5的阶乘=5*4*3*2*1)

[java]

package org.wxp.recursion;

/**

* 计算5的阶乘(result = 5*4*3*2*1)

* @author Champion.Wong

*

*

*/

public class Test01 {

public static void main(String[] args) {

System.out.println(f(5));

}

public static int f(int n) {

if (1 == n)

return 1;

else

return n*(n-1);

}

}

此题中,按照递归的三个条件来分析:

(1)边界条件:阶乘,乘到最后一个数,即1的时候,返回1,程序执行到底;

(2)递归前进段:当前的参数不等于1的时候,继续调用自身;

(3)递归返回段:从最大的数开始乘,如果当前参数是5,那么就是5*4,即5*(5-1),即n*(n-1)

使用Java代码求数列:1,1,2,3,5,8......第40位的数

[java]

package org.wxp.recursion;

/**

* 求数列:1,1,2,3,5,8......第40位的数

* @author Champion.Wong

*

*/

public class Test_02_Fibonacci {

public static void main(String[] args) {

System.out.println(f(6));

}

public static int f(int n ) {

if (1== n || 2 == n)

return 1;

else

return f(n-1) + f(n-2);

}

}

此题的突破口在:从第3位数开始,本位数是前两位数的和。要计算第多少位的值,那么就需要将位数作为参数传进方法进行计算。

(1)首先,当位数为1和2时,当前返回的值应该是1;

(2)然后,当位数为3时,返回值应该=2=1+1;

当位数为4时,返回值=3=2+1;

当位数为5时,返回值=5=3+2;

当位数为6时,返回值=8=5+3;

......

(3)由(2)得知,大于等于3的情况下,当前位数(n)的数值=f(n-1)+f(n-2)

心得:有些初学者可能认为递归即是自己调用自己,那岂不是死循环了。对,如果递归写的不合理,那就是死循环了。但是如果写的合理,加上“边界条件”,程序执行到底的时候,会逐层返回。就像我们爬山一样,我们绕着山路爬上一层又一层,如果没有山顶,我们会一直往上爬。但如果到了山顶,就按照上山时候的步骤一层一层的往下爬。

时间: 2024-11-10 13:13:16

转(Java中的递归思想)的相关文章

Java中的递归思想

转自:https://www.cnblogs.com/xiaosen992608/p/4037682.html 递归: 递归的概念:方法自身调用自身则称为递归. 递归的分类: 间接递归:方法A调用方法B,方法B调用方法C,方法C调用方法A. 直接递归: 方法A调用方法A.(常用) 递归的注意事项: 递归一定要出口:结束递归的条件. 递归次数不要太多. 如果递归不结束,则会报错. java.lang.StackOverflowError: 栈内存溢出错误 递归会内存溢出隐患的原因: 方法不停地进栈

java中的递归思想及应用

递归就是自己调自己,最需要注意的就是结束条件,否则可能就是死循环,导致内存溢出 public T a(Object x,Object y) { if(条件true) { a(x1,y1); } else { return f(x,y); } } 例如: 1.求阶乘 5!=5x4x3x2x1 分析:递归是一层一层推进,第一层是 5*4,第二层4*3,第三层,3*2,递归入参分别是5,4,3,2,1,当为1时返回1,递归终止 public int f(n) { if(n=1) { return 1:

2018.3.31 java中的递归

java中的递归 1.概念 定义一个方法时,出现本方法调用本方法的过程,称之为递归 2.特点 必然有一个边界条件 使用递归代码往往更简洁,可读性强 3.什么时候使用递归 n的阶乘和n的累加定义 f(n) =1 f(n)=f(n)*f(n-1) 4.普通实现与递归实现的比较 普通实现 //计算5的阶乘 public class Demo { public static void main(String[] args) { int sum = 1; for (int i =5; i >=1; i--

Java中的递归调用

Java中不合理的使用递归调用,可能会导致栈内存溢出,这点是需要注意的. java将为每个线程维护一个栈,栈里将为每个方法保存一个栈帧,栈帧代表了一个方法的运行状态. 也就是我们常说的方法栈.最后一个为当前运行的栈帧. 那么每一次方法调用会为新调用方法的生成一个栈帧,保存当前方法的栈帧状态,栈帧上下文切换,切换到最新的方法栈帧. 在递归和循环之间选择时,应该优先选择的是循环而非递归,特别是要避免深度的递归. 关于递归还需要了解的是尾递归调用,尾递归调用是可以被进行优化的. 尾调用指的是一个方法或

初识java数组与递归思想

数组 数组的初始化: 1.静态初始化: 值由我们来给定,长度通过系统来计算. 格式举例: int[] arr=new int[]{这里是我们给定的值} 静态初始化的简写格式: int[] arr={这里是我们给定的值}:这种方式用法的比较多. 2.动态初始化: 长度有我们来给定,值有系统初始化默认值.各个类型对应的默认值不一样,我们 下面会介绍. 格式举例: int[] arr=int[我们指定的长度]; 注意: 数组类型的变量有两种定义方式: 1.int[] a: 2.int a[]: 推荐使

Java中的核心技术思想

Java已经成为一个庞大而复杂的技术平台,对于开发人员而言,要想更好的掌握Java技术,深入理解底层的技术处理细节必不可少.对核心概念和思想的掌握可以帮助我们举一反三.触类旁通,有助于提升我们对整个Java平台的理解力.这里所介绍的是Java技术平台的几个核心概念,其中所蕴含的思想有助于我们更深刻的理解Java技术.Java虚拟机Java虚拟机的主要任务是装在class文件并且执行其中的字节码.Java虚拟机包含一个类装载器,它可以从程序和API中装载class文件.Java API中只有程序执

Java中的递归原理分析

解释:程序调用自身的编程技巧叫做递归. 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无限集合. 递归的三个条件: 边界条件 递归前进段 递归返回段 当边界条件不满足时,递归前进:当

面试中常见的算法之Java中的递归

1.方法定义中调用方法本身的现象2.递归注意实现 1) 要有出口,否则就是死递归 2) 次数不能太多,否则就内存溢出 3) 构造方法不能递归使用3.递归解决问题的思想和图解: 分解和合并[先分解后合并] 1. 常见的斐波那契数列 1,1,2,3,5,8,13,21,...特征: 从第三个数开始,每个数是前两个数的和. int count = 0; private int getFibo(int i) { if (i == 1 || i == 2) { count = count+1; Syste

java中的递归

递归算法的基本思想就是"自己调用自己",一个使用递归技术的方法将会直接或间接的调用自己. 递归需要满足两点: 1)定义递归头:说白了就是条件,在什么时候不去调用了,如果没有条件,则会陷入死循环. 2)要有递归体:就是什么时候调用自己. 例子:100的阶乘 /** * 计算20的阶乘 */ public class Recursion { static long factorial(int n){ if(n==1) { //递归头 return 1; } else { //递归体 ret