10java可变长参数与递归
可变长参数
示例:
package MethodDemo;
public class Demo05 {
public static void main(String[] args) {
Demo05 demo05 = new Demo05();//因为写方法时没有写成类方法,所以调用这个方法时要new一个类,通过类调用,
demo05.findmin(3.3,3.4,3.5);
demo05.findmin(1,3.14, 56, 59,8.2,96,5.6);//方法的重载
}
public void findmin(int a,double... numbers) {//注意这里使用可变长参数时,一定要把可变长参数放在参数的最后一项
if (numbers.length == 0){
System.out.println("Don't be kidding");
return;
}
double min = numbers[0];
for (int i = 0; i < numbers.length; i++) {
if (min > numbers[i]) {
min = numbers[i];
}
}
if(a<=min){
min=a;
}
System.out.println("The minimum number is :" + min);
}
public void findmin(double... numbers) {
if (numbers.length == 0){
System.out.println("Don't be kidding");
return;
}
double min = numbers[0];
for (int i = 0; i < numbers.length; i++) {
if (min > numbers[i]) {
min = numbers[i];
}
}
System.out.println("The minimum number is :" + min);
}
}
需要注意的是这里使用的可变长参数的实质就是产生了一个名字为numbers的一维数组,然后使用的时候使用数组的下标访问数组的内容
递归思想
package MethodDemo;
public class Demo06 {
public static void main(String[] args) {
//计算5!(5的阶乘)5!=5*4*3*2*1
double factor = factorial(5);
System.out.println("5!=" + factor);
}
public static double factorial(double num) {
if (num == 1) {
return 1;
} else {
return num * factorial(num - 1);
}
}
}
图1
图2
关于递归的解释:
- 首先知道递归的定义:自己调用自己;根据流程图看到,每次都是返回上一次的计算结果乘以下一次的函数值 ,乘到最后一项是f(1),递归结束条件 num=1时,返回值为1,也即是f(1)=1;重点来了!看图2的对应关系,当递归临界条件f(1)=1知道了之后,第4级立即变成num*(num-1),而此时的num的值是2,所以就得到了第四级的结果为2,依次类推,即可得到计算结果。
- 虽然factorial方法里面有两个return,但是两个return操作的是一个内存空间。
需要说明的是,使用递归并不是一定很高级,只有在递归次数很少时,使用递归可以简便一些;但是递归次数很大时,编译器会进行压栈操作,需要把大量的中间变量进行压栈,如果递归次数很多,就会产生内存不足等一系类问题。
当然,也可以使用其他方法达到相同的效果
package MethodDemo;
public class Demo06 {
public static void main(String[] args) {
//计算5!(5的阶乘)5!=5*4*3*2*1
Demo06 demo06 = new Demo06();
demo06.factorial(5);
}
public void factorial(double num){
double factorial=1;
for (int i = 5; i >=1; i--) {
factorial*=i;
}
System.out.println("5!="+factorial);
}
}
运行结果如下:
练习:写一个简易的计算器程序。
package MethodDemo;
import java.util.Scanner;
public class Demo07 {
public static void main(String[] args) {
//简易计算器,没有混合运算的功能
String symbol = "a";
System.out.println("Welcome to the simple calculator.");
Scanner scanner = new Scanner(System.in);
while (!scanner.hasNext("#")) {
symbol = scanner.next();
double num1 = scanner.nextDouble();
double num2 = scanner.nextDouble();
switch (symbol) {
case "+":
Add(num1, num2);
break;
case "-":
Minuse(num1, num2);
break;
case "*":
Multiply(num1, num2);
break;
case "/":
Division(num1, num2);
break;
default:
System.out.println("End!");
}
}
scanner.close();
}
public static void Add(double num1, double num2) {
System.out.println(num1 + "+" + num2 + "=" + (num1 + num2));
}
public static void Minuse(double num1, double num2) {
System.out.println(num1 + "-" + num2 + "=" + (num1 - num2));
}
public static void Multiply(double num1, double num2) {
System.out.println(num1 + "*" + num2 + "=" + (num1 * num2));
}
public static void Division(double num1, double num2) {
System.out.println(num1 + "/" + num2 + "=" + (num1 / num2));
}
}
自学java,请多多指教!