可变参数与递归

一、可变参数

◆ 在方法声明中,在指定参数类型后加一个省略号 (...)。

◆ 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。

package com.flower.method;  
  
public class Demo04 {  
  
    static void main(String[] args) {  
  
        // 创建对象  
        Demo04 demo04 = new Demo04();  
  
        // 调用test方法  
        demo04.test(1,2,3,4,5,6);  
  
        System.out.println("分割线====================================");  
  
        // 调用printMax  
        printMax(34,3,5,32,78,89.9,45.7);  
  
        // 传递数组  
        printMax(new double[]{1,2,3,45,67,87});  
    }  
  
    // 方法、可变参数(不定向参数)  
    public void test(int... i) {  
  
        System.out.println(i[0]);  
        System.out.println(i[1]);  
        System.out.println(i[2]);  
        System.out.println(i[3]);  
        System.out.println(i[4]);  
        System.out.println(i[5]);  
    }  
  
	// 比大小
    public static void printMax(double... numbers) {  
  
		// 判断是否为空
        if (numbers.length == 0) {  
  
            System.out.println("No argument passed.");  
  
            return;  
        }  
  
        double result = numbers[0];  
  
        // 排序  
        for (int i = 1; i < numbers.length; i++) {  
  
            if (numbers[i] > result) {  
  
                result = numbers[i];  
            }  
        }  
  
        System.out.println("The max value is " + result);  
    }  
}

输出结果

image

二、递归

递归就是:A方法调用A方法!就是自己调用自己。

利用递归可以用简单的程序来解决一些复杂的问题。
它通常把一个大型复杂的问题,层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的能力在于用有限的语句来定义对象的无限集合。

递归结构包括两个部分:

  • 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
  • 递归体:什么时候需要调用自身方法。

当求的数据很大时,能不用递归就不用,递归调用自身太多次时,会影响程序性能。

package com.flower.method;  
  
public class Demo05 {  
  
    static void main(String[] args) {  
  
        // 创建对象  
//        Demo05 demo05 = new Demo05();  
        // 调用方法  
//        demo05.test();  
  
        // 如果递归深度过大,即使有终止条件,递归次数太多,超过了 JVM 默认的栈容量(通常只有几百到几千层),也会报栈溢出错误。  
        // 调用factorial方法  
        System.out.println(factorial(5));  
    }  
  
    // 错误递归,会报栈溢出错误  
    // 递归没有正确的递归头(终止条件):方法会无限调用自身,栈帧不断压入栈中,最终超出栈的容量。  
//    public void test() {  
//  
//        test(); // 死循环,没有结尾,会报错  
//    }  
  
    // 正确递归  
    // 阶乘  
    // 1! = 1  
    // 2! = 2*1    // 5! = 5*4*3*2*1  
    // 2    2*factorial(1) = 2*1    
    // 3    3*factorial(2)    
    public static int factorial(int n) {  
  
        if (n == 1) {  
  
            return 1;  
  
        } else {  
  
            return n * factorial(n-1);  
  
        }  
    }  
}

image

posted @ 2026-06-01 11:49  花时玉  阅读(13)  评论(0)    收藏  举报