zoukankan      html  css  js  c++  java
  • 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,请多多指教!
  • 相关阅读:
    spring framework体系结构及模块jar依赖关系
    Spring的核心jar包
    Spring AOP的理解和使用
    Spring特点与工作原理
    接口和抽象类的区别
    Java重载和重写的区别
    Jdk1.8中的HashMap实现原理
    Java集合中List,Set以及Map等集合体系详解
    Spring面试题整理
    ActiveMQ入门操作示例
  • 原文地址:https://www.cnblogs.com/fanfada/p/13759073.html
Copyright © 2011-2022 走看看