说到递归方法,我的理解就是直接调用本身或间接调用本身的行为,类型分为直接递归和间接递归两种,我们先来看一个案例:
问题描述:利用递归方法求1加到l(其中l为控制台输入的数字)的和
public class Study {
public static void main(String args[]) {
//加法:实现从1加到l(从控制台输入的数)的和;
Add add = new Add();
System.out.print("请输入需要求和的最后一位数的值:");
@SuppressWarnings("resource")
Scanner h =new Scanner(System.in); //从控制台输入数据
int l =h.nextInt(); //接收数据
int m= add.sum(l);
System.out.println("从1加到l的和为m="+m);
}
}
//实现加法功能定义的类(直接递归,调用本身)
class Add{
int sum(int n) { //定义求和方法
if(n==0) {
return 0;//本题所求数从1开始加,,当判断为0时返回值为0
}else {
return sum(n-1)+n;//调用自身进行求和操作
}
}
}
结果显示:
过程分析:
上述案例中,求和方法调用了自身,这称为直接调用,调用结果为n+sum(n-1),而sum(n-1)=n-1+sum(n-2),一直调用自身,直到调用结果为sum(0)+1,这时结束调用,其过程为n+(n-1)+(n-2)+…+(n-m+1),然后就得到我们想要的结果,其中m代表次数。
知识点晋级:掌握了上述案例,我们来看一种有趣的题型,这种题在一些程序设计大赛中也喜欢考,重庆市的计算机程序设计赛就有这种类似题型,包括蓝桥杯等等,一起来看看:
问题描述:利用递归方法编写程序打印出带有#的图形,结果图如下:
代码实现:
class King{
//控制‘#’前后空格数
void output(char ch,int k ) {
if(k>0) {
System.out.print(ch);
output(ch,k-1); //直接递归方法,调用本身
}
}
void show(char ch,int m,int n ) {
if(n>0) {
output(' ',m); //间接递归方法,间接调用output方法
output(ch,n);
System.out.println(); //换行
show(ch,m+2,n-4); //直接递归方法,直接调用本身
}
}
}
public class Study{
public static void main(String args[ ]){
King king=new King( ); //创建引用对象
System.out.println();
king.show('#',4,19); //调用show方法,传递三个参数,‘#’为我们需要打印的图形符号,数字4用来调整空格(第一行空了4个字符的位置),19代表需要打印的第一层‘#’数量
}
}
过程分析:起初我打印出来的图形是这样的,如下图:
这个程序没有考虑到字符’#'前后的空格数,只实现了把#打印出来,所以整个过程不是一气呵成的,也是需要一步一步思考才能写出程序来。
附上这个程序的源码:(仅供学习参考)
public class Study {
public static void main(String args[]) {
System.out.println();
King.f(19);
}
}
class King{
public static int f(int n) {
for(int i=1;i<=n;i++) {
System.out.print("#");
if(n<3) {
break;
}
}
System.out.println("");
return f(n-4);
}
}