递归
递归的概念
递归就是一个方法在执行的过程中调用自身。
例1:求n的阶乘
import java.util.Scanner;
public class Main {
//这是创建的factor方法
public static int factor(int n) {
//当n等于1时,返回值为1
if(n == 1){
return 1;
}
//当n不等于1时,调用递归
int ret = n*factor(n - 1);
//调用递归,此时factor(int n)的n等于(n-1)的值
return ret;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入一个整数:");
//调用Scanner类,创建一个int型变量n来承载从键盘输入的数
int n = input.nextInt();
//创建一个factor方法,创建一个int型变量ret来承载fac方法输出的值
int ret = factor(n);
//打印输出ret的值
System.out.println(ret);
}
}
输出结果
请输入一个整数:5
120
图解:
按照箭头上的数字序号执行,(1),(2),(3),(4)为递,(5),(6),(7),(8)为归。
当(1)到(3)项,都无法满足终止递归条件,所以一直执行int ret = n * factor(n - 1)语句,继续调用fac方法,每次n的值都等于n - 1。当执行到第(4)项时,n等于1,执行if语句,终止递归,执行第(5)项,factor(2)= ret = 21=2,然后执行第(6)项,factor(3) = ret = 32 = 6,然后返回执行第(7)项,factor(4) = 46 = 24,然后执行factor(5) = ret = 524 = 120.最后执行return ret语句,递归结束。
例1进阶版:
例2:求n的阶乘的前n项和
import java.util.Scanner;
public class Test {
//这个方法就是sum方法,求n阶乘的前n项和
public static int sum(int n) {//n为输入的数字n
//当n等于1时,终止递归,返回值为1;
if(n == 1){
return 1;
}
//当n不等于1时返回值为(调用fac方法加递归sum方法,此时n等于n减1)
return fac(n) + sum(n - 1);
}
//下面时fac方法,求n的阶乘
public static int fac(int a) {//a与输入的数字相等
//当a等于1时,终止递归,返回值为1
if(a == 1){
return 1;
}
//当n不等于1时,返回值为a乘递归fac方法,此时等于a减1
return a * fac(a - 1) ;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入数字:");
//输入数字n来表示计算n的阶乘的前n项和
int n = input.nextInt();
//sum(n)表示写一个方法来计算n的阶乘的前n项和
//创建一个int型变量ret来承载方法sum的值
int ret = sum(n);//调用sum方法
System.out.println(ret);
}
}
结果
请输入数字:5
153
递归是一种重要的编程解决方式,有些问题用递归解决起来很容易,如斐波那契数和汉诺塔问题。但是有些问题递归与非递归都能解决时。同等情况下,递归没有非递归高效。