Java学习笔记--可变参数,递归

一,可变参数

1.需求:

定义一个方法,实现n个整数相加

2.分析:

方法参数位置,只明确了参数的类型,但是不明确参数个数,此时就可以定义成可变参数

介绍和基本使用

1.定义格式:

数据类型...变量名

2.注意:

a.可变参数的本质是一个数组

b.参数位置不能连续写多个可变参数,而且当可变参数和其他普通参数一起使用时,可变参数需要放到参数列表最后

以下示例一个加法功能

java 复制代码
public class demo01var {
    public static void main(String[] args) {
        sum(1,2,3,4,5);

    }

    public static void sum(int...arr){
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum+=arr[i];
        }
        System.out.println(sum);
    }
}

用反编译软件可以看出实际就是创立了一个数组进行写入

示例,字符串拼接:返回n个字符串拼接结果,如果没有传入字符串,那么返回空字符串""

java 复制代码
public class demo02var {
    public static void main(String[] args) {
        st("asd","wdsd","sadadadwa");
    }


    public static void st(String...arr){
        String string = "";
        if (arr.length==0){
            System.out.println("");
        }else{
            for (int i = 0; i < arr.length; i++) {
            string = arr[i];
            System.out.print(string);
        }
        }


    }
}

总结:

使用可变参数的优点是不用自己去手动new一个数组出来,不用自己开辟空间,但可变参数毕竟只是局部变量,不能达到全局变量那种,"类中方法外"的境界,不方便后面程序调用


二,递归

1.概述:方法内部自己调用自己

2.分类:

a.直接递归

public static void method(){

method()

}

b.间接递归:

A(){

B()

}

B(){

C()

}

C(){

A()

}

3.注意:

a.递归必须要有出口,否则会出现"栈内存溢出"

示例,无出口

java 复制代码
public class Demo01recursion {
    public static void main(String[] args) {

        method();
    }

    public static void method(){
        method();
    }
}

如图

b.递归即使有出口,递归次数不不要太多

示例一:利用递归输出3到1

使用if语句实现递归

java 复制代码
public class Demo02recursion {
    public static void main(String[] args) {

        method(3);
    }

    public static void method(int n){
        if(n==1){
            System.out.println(n);
            //结束方法
            return;
        }
        System.out.println(n);
        n--;
        method(n);
    }
}

原理图如下,main函数进栈运行,在方法中调用方法,层层递归,再逐步返回

示例二:求n!(n的阶乘)

需求:定义一个方法,完成3的阶乘

3*2*1

分析:假如定义一个方法,代表n的阶乘 -> method(n) -> n接收几,就代表几的阶乘

method(1) 1

method(2) 2*1 -> 2*method(1)

method(3) 3*2*1 -> 3*method(2)

method(n) -> n*method(n-1)

代码实现

java 复制代码
public class Demo03Recursion {
    public static void main(String[] args) {

        int method = method(3);
        System.out.println("method = " + method);
    }

    public static int method(int n){
       if(n==1){
           return 1;
       }
       return n*method(n-1);
    }
}

原理图如下,方法调用再逐步返回

示例三:计算斐波那契数列(Fibonacci)的第n个值

西元1202年,斐波那契。他提出了一个问题:假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡

问:一对刚出生的兔子,一年内繁殖成多少对兔子?

规律:一个数等于前两个数之和,比如: 1 1 2 3 5 8 13 21 34 55....

1.假设:定义一个方法,叫做method,参数传递month,代表月份

2.分析:

method(1) 1

method(2) 1

method(3) 2 -> method(1)+method(2)

method(4) 3 -> method(2)+method(3)

method(5) 5 -> method(3)+method(4)

method(n) -> method(n-2)+method(n-1)

代码实现,当月份是1或2月时,兔子都是一对,还没长大生不了,到后面开始一批一批生

java 复制代码
public class Demo04recursion {
    public static void main(String[] args) {

        int method = method(12);
        System.out.println("method = " + method);
    }

    public static int method(int n){
       if(n==1 || n==2){
           return 1;
       }
       return method(n-2)+method(n-1);
    }
}

总结:

递归是非常实用而且方便的一种思想,更加体现了面向对象编程思想,对于理解程序嵌套,进行初步构造有很大帮助。

相关推荐
软件开发技术深度爱好者3 分钟前
中学生学习工具:多学科自学启导者(轻量版)实现
学习·ai·技术实践
DianSan_ERP8 分钟前
多平台订单自动下载与回传的技术实现:从消息推送到状态闭环引言
java·linux·服务器·前端·网络·架构·自动化
Joe_Wang510 分钟前
【从0到1学习JVM · 13】点进JDK源码只有一个分号?搞懂本地方法栈与JNI机制
java·jvm·学习·本地方法栈
编码者卢布16 分钟前
【App Service 】WebJobs 多实例实验:谁在运行,什么时候运行?
开发语言·python
kaixin_learn_qt_ing20 分钟前
Qt抽屉窗体实现demo
开发语言·qt
~光~~21 分钟前
【嵌入式Linux学习】GFP_NOIO / GFP_NOFS(Linux 内核 gfp 分配标志)
linux·运维·学习
坤坤子吖24 分钟前
ELF加载、动态链接、GOT与PLT
linux·笔记·学习
quantdash_cc24 分钟前
Python 获取实时行情后如何进行批量筛选?从全市场快照到策略候选池
开发语言·python·数据分析·量化交易·股票数据·quantdash
AI 算法大模型备案~当当29 分钟前
各地备案数量怎么看:一份属地公告的认读与台账方法
java·数据库·人工智能
论文复现现场34 分钟前
论文复现看到“RTX 3090 or higher”:显存、CUDA、batch size 与 OOM 怎么判断?
开发语言·pytorch·batch·cuda·rtx3090