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,请多多指教!
原文地址:https://www.cnblogs.com/fanfada/p/13759073.html