递归(*)
- A方法调用B方法,很容易理解!
- 递归就是:A方法调用A方法!就是自己调用自己
package method;
public class Demo09 {
public static void main(String[] args) {
Demo09 test = new Demo09();//创建类的对象
test.test();//运行后报错,栈溢出!!!
}
public void test(){
test();
}
}
- 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
package method;
public class Demo10 {
//阶乘:自然数n的阶乘写作n!
//2! 2*1
//3! 3*2*1
//5! 5*4*3*2*1
//递归思想
public static void main(String[] args) {
System.out.println(f(5));//递归基数不能太大,电脑会崩溃!!小点的计算可以
}
//1! 1
//2! 2*1
//5! 5*4*3*2*1
public static int f(int n){
if(n == 1){ //边界条件 递归头,可以让程序不陷入自循环
return 1;
}else { //前阶段
return n*f(n-1);//返回阶段n*(n-1)
}
}
}
输出:
- 递归结构包括两个部分:
-
递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
-
递归体:什么时候需要调用自身方法。
Java栈机制
章节练习
- 写一个计算器,要求实现加减乘除功能,并且能够循环接收新的数据,通过用户交互实现。
思路推荐:
- 写4个方法:加减乘除
- 利用循环+switch进行用户交互
- 传递需要操作的两个数
- 输出结果
package method;
import com.sun.deploy.security.BadCertificateDialog;
import java.util.Scanner;
public class Demo11 {
public static void main(String[] args) {
//写一个计算器,要求实现加减乘除功能,并且能够循环接收新的数据,通过用户交互实现。
/*思路推荐:
1. 写4个方法:加减乘除
2. 利用循环+switch进行用户交互
3. 传递需要操作的两个数
4. 输出结果*/
System.out.println("请输入第一个数a: ");
double a = new Scanner(System.in).nextDouble();
System.out.println("请输入计算符号: ");
String F = new Scanner(System.in).next();
System.out.println("请输入第二个数b: ");
double b = new Scanner(System.in).nextDouble();
Demo11 demo11 = new Demo11();
switch (F){
case "+":
System.out.println("计算结果为: "+demo11.add(a,b));
break;
case "-":
System.out.println("计算结果为: "+demo11.minus(a,b));
break;
case "*":
System.out.println("计算结果为: "+demo11.multiplication(a,b));
break;
case "/":
if (b == 0){ //分母不能为0
System.out.println("除数不能为0!!!");
}else {
System.out.println("计算结果为: "+demo11.division(a,b));
}
break;
default:
System.out.println("别为难俺了,俺只支持简单的加减乘除运算o(╥﹏╥)o");
}
}
//加法
public double add(double a,double b){ //加法add
return a+b;
}
//减法
public double minus(double a,double b){//减法minus
return a-b;
}
//乘法
public double multiplication(double a,double b){//乘法multiplication
return a*b;
}
//除法
public double division(double a,double b){//除法division
return a/b;
}
}
输出:
加法
减法
乘法
除法
其他