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,请多多指教!
  • 相关阅读:
    pthread条件变量
    c++信号处理
    必杀技
    待飞日记(第四天和第五天)
    c++面试题总结(2)
    比起主流的30秒,10秒广告能获得2倍的效果
    c++面试题总结(1)
    待飞日记(第三天)
    static_cast, dynamic_cast, const_cast探讨
    c++一些问题总结
  • 原文地址:https://www.cnblogs.com/fanfada/p/13759073.html
Copyright © 2011-2022 走看看