解释:程序调用自身的
编程
技巧叫做递归。
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
递归的三个条件:
边界条件
递归前进段
递归返回段
当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
下面通过两个示例程序来说明:
使用
Java代码求5的阶乘。(5的阶乘=5*4*3*2*1)
package com.cn.rcy;
/**
* 计算5的阶乘(result = 5*4*3*2*1)
* @author rcy
*/
public class Test {
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位的数
package com.cn.rcy;
/**
* 求数列:1,1,2,3,5,8......第40位的数
* @author rcy
*/
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)
心得:有些初学者可能认为递归即是自己调用自己,那岂不是死循环了。对,如果递归写的不合理,那就是死循环了。但是如果写的合理,加上“边界条件”,程序执行到底的时候,会逐层返回。就像我们爬山一样,我们绕着山路爬上一层又一层,如果没有山顶,我们会一直往上爬。但如果到了山顶,就按照上山时候的步骤一层一层的往下爬。
所谓递归,是指程序调用自身,当然,递归不会无休止地调用下去,它必然有一个出口,当满足条件时程序也就结束了,不然的话,那就是死循环了。
看下面这个类,有几个递归方法,看了之后肯定会对你学习递归很有帮助的。
/**递归类Recursion的定义*/
public class Recursion{
//递归方法DecimalToBinary,把一个十进制数转换成二进制数
public static void DecimalToBinary(int num){
if(num ==0){ //当num=0时,循环结束
return;
}else{
DecimalToBinary(num/2); //调用递归方法
System.out.print (num%2);
}
}
//递归方法sum,求1+2+...+100 的求和
public static int sum(int num){
if(num > 0){
return num + sum(num-1); //调用递归方法
}else{
return0; //当num=0时,循环结束
}
}
//递归方法yueshu,求两个数的最大公约数 ,用两个数的绝对值与这两个数较小的那个一直比较,直到相等为止。
public static void yueshu(int num1,int num2){
if(num1 == num2){
System.out.println(num1); //num1=num2时,结束
}else{
yueshu(abs(num1-num2),min(num1,num2)); //调用递归方法
}
}
//求两个数绝对值
public static int abs(int num){
return num>0 ? num : -num;
}
//求两个数较小者
public static int min(int num1,int num2){
return num1 > num2 ? num2 :num1;
}
//递归方法hanon,求瀚诺塔函数
public static void hanon(int n,char a,char b,char c){
if(n == 1){
move(1,a,c);//最后一种情况是,把A柱子上盘子移到C柱子上。
return;
}
hanon(n-1,a,c,b); //递归,把n-1个盘子从A 盘上借助C盘移到B盘上
move(n,a,c);//调用move()方法
hanon(n-1,b,a,c);//递归,把把n-1个盘子从B盘上借助A盘移到C盘上
}
public static void move(int n,char a,char c){
System.out.println(n+":"+a+"-->"+c);//打印移动盘子情况
}
//主函数main
public static void main(String [] args){
yueshu(12,8); //求最大公约数
hanon(3,'A','B','C'); //求瀚诺算法
System.out.println(sum(100));//求和
DecimalToBinary(103);//十进制转换二进制
}
}