递归
递归就是自己调用自己。
通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,只需用少量的程序就可以描述出解题过程所需要的多次重复计算,大大减少代码量。
递归的能力在于用有限的语句来定义对象的无限集合。
递归结构包括两部分:
- 递归头:什么时候不调用自己。也就是出口。没有出口就会陷入死循环。
- 递归体:什么时候要调用自己。
package com.study.method;
import java.util.Scanner;
public class Demo05 {
//递归求阶乘 n!=n*(n-1)*...*2*1
public static void main(String[] args) {
System.out.println("请输入:");
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
System.out.println(f(i));
scanner.close();
}
public static int f(int n) {
if (n == 1) {
return 1;
} else {
return n * f(n - 1);
}
}
}
java是栈机制,最底层是main方法,每调用一个方法都会往上压一层。
方法结束就会消失,程序执行完毕就会栈里面就会变空。
对于嵌套层次比较深的程序,机器就会力不从心。
调用方法次数太多了,会影响机器性能。能不用尽量不用。主要是学习递归的思想。
作业
计算器:实现加减乘除功能,并且能够循环接收新的数据,通过用户交互Scanner实现。
思路:
- 写四个方法:加减乘除
- 循环+Switch进行用户交互
- 传递需要操作的两个数
- 输出结果
过程中遇到一个问题:
不知道字符型数据该如何用scanner接收?
char sex=scanner.next().charAt(0);
package com.study.method;
import java.util.Scanner;
public class Demo06 {
/*
计算器:实现加减乘除功能,并且能够循环接收新的数据,通过用户交互Scanner实现。
思路:
写四个方法:加减乘除
循环+Switch进行用户交互
传递需要操作的两个数
输出结果
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个操作数:");
while (scanner.hasNextDouble()){
int a= scanner.nextInt();
if (a==999){
System.out.println("程序结束!");
break;
}
System.out.println("请输入操作符(+ - * /):");
char m=scanner.next().charAt(0);
System.out.println("请输入第二个操作数:");
int b= scanner.nextInt();
System.out.println("结果为:");
switch (m) {
case '+':
System.out.println(add(a, b));
break;
case '-':
System.out.println(sub(a, b));
break;
case '*':
System.out.println(mul(a, b));
break;
case '/':
System.out.println(rem(a, b));
break;
default:
break;
}
System.out.println("请继续输入第一个操作数(输入999退出):");
}
scanner.close();
}
// 加
public static final int add(int a,int b){
return a+b;
}
// 减
public static final int sub(int a,int b){
return a-b;
}
// 乘
public static final int mul(int a,int b){
return a*b;
}
// 除
public static final double rem(int a,int b){
return a/(double)b;
}
}
功能实现!