递归
递归的基本思想就是“自己调用自己”
递归的基本结构
- 递归头:什么时候不调用自身方法。如果没有递归头,程序将会陷入死循环。
- 递归体:什么时候需要调用自身方法。
注意事项
- 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模大小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
- 在要求高性能的情况下尽量避免使用递归,递归调用既花时间又耗内存。
- 任何能用递归解决的问题也能用循环迭代解决。
- 调用自己的次数过多时,尽量少用递归。
package com.panpan.method;
public class Demo06 {
public static void main(String[] args) {
//递归
System.out.println(5+"!="+f(5));//5!=120
//迭代
Demo06 test02 = new Demo06();
System.out.println(test02.f2(5));//120
}
//使用递归表示阶乘
public static int f(int n){
if (n==1){//递归头
return 1;
}else {
return n*f(n-1);//递归体
}
}
//使用循环迭代计算阶乘
public int f2(int n){
int num = 1;
for (int i = n; i > 1; i--) {
num *= i;
}
return num;
}
}
练习
写一个计算器,要求实现加减乘除功能,并且能够循环接收新的数据,通过用户交互实现。
- 写4个方法:加减乘除
- 利用循环和switch进行用户交互
- 传递需要操作的两个数
- 输出结果
优秀博文
package com.panpan.method;
import java.util.Scanner;
//此代码没有实现循环接收数据,可以借鉴上述优秀博文实现
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//使用用户交互接收两个数据
System.out.println("请输入两个数据:");
double num1 = scanner.nextDouble();
double num2 = scanner.nextDouble();
//使用用户交互接收运算符
Scanner scanner1 = new Scanner(System.in);
System.out.println("请输入运算符:");
String operator = scanner1.next();
switch (operator){
case "+":
System.out.println("和为"+add(num1,num2));
break;
case "-":
System.out.println("差为"+sub(num1,num2));
break;
case "*":
System.out.println("积为"+mul(num1,num2));
break;
case "/":
System.out.println("商为"+div(num1,num2));
break;
default:
System.out.println("错误操作");
}
scanner.close();
scanner1.close();
}
public static double add(double num1,double num2){
return num1+num2;
}
public static double sub(double num1,double num2){
return num1-num2;
}
public static double mul(double num1,double num2){
return num1*num2;
}
public static double div(double num1,double num2){
if (num2 == 0){
System.out.println("除数不能为零!!!");
return -0;
}else{
return num1/num2;
}
}
}