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);
    }
}

总结:

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

相关推荐
SomeB1oody20 分钟前
【Rust自学】4.1. 所有权:栈内存 vs. 堆内存
开发语言·后端·rust
toto41221 分钟前
线程安全与线程不安全
java·开发语言·安全
PP东26 分钟前
ES6学习Generator 函数(生成器)(八)
javascript·学习·es6
筏镜1 小时前
调整docker bridge地址冲突,通过bip调整 bridge地址
java·docker·eureka
水木流年追梦1 小时前
【python因果库实战10】为何需要因果分析
开发语言·python
winner88811 小时前
git merge 冲突 解决 show case
java·git·git merge·git冲突
m0_675988232 小时前
Leetcode2545:根据第 K 场考试的分数排序
python·算法·leetcode
破-风2 小时前
leetcode---mysql
算法·leetcode·职场和发展
w(゚Д゚)w吓洗宝宝了2 小时前
C vs C++: 一场编程语言的演变与对比
c语言·开发语言·c++
Wils0nEdwards2 小时前
Leetcode 合并两个有序链表
算法·leetcode·链表