这学期开始了java的学习,在学到递归调用时,有了很大的感触。以下是一个例子以及个人理解。
我个人的理解,递归调用就是把对一个整体的引用(这里解释不太好)或者是拿过来反复利用(???自己糊弄自己的牵强解释)
举个栗子:
public static void main(String[] args){
System.out.println(method1(5));
}
public static int method1(int n){
return n;
}
输出的结果就是5.
分析一下,就是在main函数中,它先执行System.out.println(method(5)); 结果发现method1(5)没法直接输出。就需要执行method1(n)。所以,我个人主观认为,就是把下面的method1(n)拿过来用。
(感觉例子不是很清晰)
下面用递归调用完成从1依次加到7的累加计算,代码如下:
/*递归调用,计算1到n的值*/
public class DiGui{
public static void main(String[] args){ //很正式的开头
int n=7; //很一般的定义
int sum=method1(n); //这里比较重要,把算出的和用sum表示,用method1(n)赋值
System.out.println(sum); //输出sum 表示1到n的和
}
public static int method1(int n){ //这里弄了个新花里胡哨
if(n==1){ //如果进来的n等于1,就直接返回一个1,如果不是1,就走到了万恶的else 返回n并且加上method1(n-1)
return 1; //如果是这样,那就是相当于再次走进了method1(n)方法,只不过这次的n值比上次少了个1.
} //显然我们要再折磨一下这个method1(n),发现n-1还是不等于1,那就再返回n值,但此时的n值比上次少个1
else { //就是n-1,n-1再加method1(n-1)。现在相当于第一次5+4+(4-1)。一直反复折腾到n等于1。n等于1了,就很灵性了,
return n+ method1(n-1); //返回1,并且不需要加method1(n-1)了。那么 整个过程下来就是,5+4+3+2+1=15赋给了sum。 然后终于可以执行
} //System.out.println(sum);了*/
}
}
那么按照这个方法,就可以计算1到n的阶乘了。代码如下:
/*用递归调用计算n的阶乘*/
public class DiGuiJieCheng{
public static void main(String[] args){
System.out.println(method1(5));
}
public static int method1(int n){
if(n==1){
return 1;
}else{
return n * method1(n-1);
}
}
}
上面计算的是1到5的阶乘,运行结果无误。
总体来说,如果用递归调用的方法计算以上内容,比运用for循环的代码量少一些,至于它还有什么更大的作用,目前初学的我还没发现,以后发现了再做详细的书写。
整个过程,其实一直在做一件事,就是需要的函数就整个来执行,整个整个的用。(大概是这样,还是解释的牵强)
附上一张图,结合着“栈”的数据结构,一并解释一下从1依次加到7的过程。