文章目录
前言
递归是学习算法过程中一个比较痛苦的话题,特别是对于初学者而言,很容易让人自闭,本文以最简单的例子从最底层进行讲解,希望能让更多人懂得递归。
一、main方法执行过程
从图中可以看出,java中不管是main方法还是自己写的方法,调用时都是先加载到线程自己的栈中,然后再执行方法里面的代码,懂得了这个之后,就可以加深我们对递归过程的理解。
二、自定义函数递归过程
该图详细的描述了递归执行的全过程,相信看了该图后你一定对递归有了非常深刻的理解,即使图中案例会报异常也问题不大,因为这时你已经能够写出更复杂的正常的递归程序了,后文也还会举一些简单的递归案例来加深你的理解。
三、递归打印(案例1)
1.请看一段简单的代码,分析出它的结果
public static void test(int n){
if(n>2){
test(n-1);
}else{
System.out.println(n);
}
}
2.代码分析
从代码中可以看出,test方法中有一个if else语句,明白if else语句的同学一定知道进入该方法只会有一个结果,要么是进入if不断递归,要么是进入else打印,而且打印的时候也是递归结束的时候,所以最终的结果就是打印2
3.结果
2
四、阶乘问题(案例2)
1.问题描述
输入一个数,要求使用递归算出它的阶乘
2.思路分析
首先我们要学会如何使用递归的返回值来参与栈中下层函数的运算,其次我们要学会如何设置递归的结束条件,明白了这两点后这个问题就很容易实现了,大家看我的代码理解一下即可。
3.代码实现
public static int factorials(int n){
if(n==1){
return 1;
}else{
return factorials(n-1)*n;
}
}
五、测试源码
package com.yc.recursion;
public class PrintAndFactorials {
public static void main(String[] args) {
System.out.println("递归打印一");
test(4);
System.out.println("递归打印二");
test2(4);
System.out.println("阶乘问题");
int res = factorials(4);
System.out.println(res);
}
/**
* 递归打印一
* @param n
*/
public static void test(int n){
if(n>2){
test(n-1);
}else{
System.out.println(n);
}
}
/**
* 递归打印二
* @param n
*/
public static void test2(int n){
if(n>2){
test2(n-1);
System.out.println(n);
}else{
}
}
/**
* 计算n的阶乘
* @param n
* @return
*/
public static int factorials(int n){
if(n==1){
return 1;
}else{
return factorials(n-1)*n;
}
}
}
总结
为了尽可能地把递归讲的通俗易懂,我竭尽全力,希望更多人能轻松的学会递归,不要像我一样,曾经因它自闭过。