递归
- 递归就是A方法调用自己。
- 递归可以把大型复杂的问题层层转化为同原问题相似的规模较小的问题来求解,仅需少量的程序就可描述出解题过程所需要的多次重复运算。
- 递归如果调用太多,会栈溢出,因此只能用于部分场景。
- 递归结构的两个部分:
- 递归头:什么时候不调用自身方法,如果无头,进入死循环。
- 递归体,什么时候调用自身方法。
死循环实例:
public class Test3 {
public static void main(String[] args) {
Test3 test3 = new Test3();
test3.test();
}
public void test(){
test(); //会导致栈溢出,内存不足。
}
}
实例之阶乘计算器:
import java.util.Scanner;
public class Test4 {
//5!== 5x4x3x2x1 阶乘,及一个数从自身乘到1
public static void main(String[] args) {
while (true){
System.out.println("请输入需要计算阶乘的数字:");
Scanner scanner = new Scanner(System.in);
if (scanner.hasNextLong()){
long n = scanner.nextLong();
if (n > 0){
System.out.println(n+"的阶乘为:"+f(n));
scanner.close();
break;
}
else {
System.out.println("请输入大于0的正数!");
}
}
else {
System.out.println("请输入数字或正整数!");
}
}
}
public static long f(long n){
if (n == 1) {
return 1;
}
else {
return n*f(n-1);
/*
此处意思为若n赋给的值不等于1,那么返回方法最上面,
重新调用自身,并用n乘以被赋值n=(n-1)后的方法执行结果,
直至执行到if为true,返回1同前面每次执行出来的数相乘,
便成为一个计算阶乘的算法。
*/
}
}
}
简易计算器实例:
import java.util.Scanner;
public class Calculate {
public static void main(String[] args) {
System.out.println("=== 计算器 ===");
System.out.println("=== 1.加法计算 ===");
System.out.println("=== 2.减法计算 ===");
System.out.println("=== 3.乘法计算 ===");
System.out.println("=== 4.除法计算 ===");
System.out.println("======================");
while (true){
System.out.println("请输入需要的计算方式:");
Scanner scanner = new Scanner(System.in);
if (scanner.hasNextInt()){
int cal = scanner.nextInt();
switch (cal){
case 1 :
System.out.println("请输入第一个数:");
double a= scanner.nextDouble();
System.out.println("请输入第二个数");
double b= scanner.nextDouble();
System.out.println("结果是"+add(a,b));
scanner.close();
break;
case 2:
System.out.println("请输入第一个数:");
a= scanner.nextDouble();
System.out.println("请输入第二个数");
b= scanner.nextDouble();
System.out.println("结果是"+sub(a,b));
scanner.close();
break;
case 3:
System.out.println("请输入第一个数:");
a= scanner.nextDouble();
System.out.println("请输入第二个数");
b= scanner.nextDouble();
System.out.println("结果是"+cheng(a,b));
scanner.close();
break;
case 4:
System.out.println("请输入第一个数:");
a= scanner.nextDouble();
System.out.println("请输入第二个数");
b= scanner.nextDouble();
System.out.println("结果是"+chu(a,b));
scanner.close();
break;
}
break;
}
else {
System.out.println("请选择正确的计算方式!");
}
}
}
public static double add(double a,double b){
return a+b;
}
public static double sub(double a,double b){
return a-b;
}
public static double cheng(double a,double b){
return a*b;
}
public static double chu(double a,double b){
return a/b;
}
}