Java方法的使用和递归

目录

1.方法的使用

1.1什么是方法

1.2方法的定义语法

1.3方法的调用

1.4没有返回值的方法

1.5方法的重载

2.递归

2.1什么场景下能用方法递归?(数据结构和算法)

2.2 什么场景下可以用方法递归?

2.3 咋样写出递归代码?

2.4使用递归的练习

2.4.1  使用递归求N的阶乘

2.4.2  使用递归解决青蛙跳台阶问题 

2.4.3 计算1+2+3+...+n的和。 

2.4.4 用归找出数组的索引

3.每日一汤 

 


1.方法的使用

1.1什么是方法

方法就是一个代码片段,类似c语言中的“函数”。就是把一段{}中代码抽出来的片段。

方法存在的意义:

1.是能够模块化的组织代码(当代码规模比较复杂的时候)

2.做到代码被重复使用,一份代码可以在多个位置重复使用

3.让代码更好理解更简单

4.直接调用现有的方法,不必重复造轮子

1.2方法的定义语法

public static 方法返回值 方法名称(0...N){

//方法体代码

【return 语句】;

}

1.3方法的调用

返回值变量 = 方法名称(参数);

import java.util.Scanner;

public class Best {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入第一个数:");
        int a = sc.nextInt();
        System.out.println("输入第二个数:");
        int b = sc.nextInt();
        System.out.println("输入第三个数:");
        int c = sc.nextInt();
        System.out.println(a+","+b+"和"+ c+"中最大的是"+ max2(a,b,c));
//  max2把a,b,c先赋值给x,y,z
    }
    public static int max2(int x,int y ,int z ){
        int sum = max(x,y);
//  调用max方法,将x,y赋值给下面的x,y
        return max(sum,z);
//  经过下面max的方法判断出x,y的大小,最大值num在赋值给sum,
//  再次调用max方法,将sum和z的值赋给下面的x,y,将最大值赋给max2
    }
    public static int max( int x,int y){
        if (x > y){
            int num = x;
            return x;
        }else{
            int num = y;
            return num;
        }
    }
}

//运行结果

输入第一个数:
3
输入第二个数:
4
输入第三个数:
6
3,4和6中最大的是6 

基本规则:

1.定义方法的时候,不会执行方法的代码,只有调用的时候才会执行。

 2.当方法被调用的时候,会将实参赋值给形参。

3.参数传递完毕后,就会执行到方法体代码。

4.当方法执行完毕后(遇到return语句),就执行完毕,回到方法调用位置继续往下执行。

5.一个方法可以被多次调用。

**实参和形参的关系:在Java中,方法的参数传递只有值传递,所谓的值传递就是把实参的值赋值给形参,对实参没有任何影响。方法的返回值可有可无,没有返回值的方法使用void声明,仍然可以使用return;表示提前结束方法的调用。(直接终止本次方法的调用,返回调用处继续执行)

1.4没有返回值的方法

public class Copy {
    public static void main(String[] args) {
        int num = 1234;
        sum(num);
}
    public static void sum (int num){
// 没有返回值,只需要打印,只是输出。
        if (num > 9){
            sum(num / 10);
//找到最高位
        }
        System.out.print(num % 10+"\t");
// 按顺序打印每一位
    }
}

//运行结果

1    2    3    4     

没有返回值的方法用void。

1.5方法的重载

方法重载(overload)):方法重载发生在同一个类中,定义了若干个方法名称相同,参数列表不同(参数的类型或个数)的一组方法,与方法的返回值无关!Java中System.out.println(任何参数类型都可以),实际上是因为System定义了N个重载方法。

在上面的那个代码中,在同一个class类中,定义了max和max2,参个数不同,发生了方法重载。

2.递归

2.1什么场景下能用方法递归?(数据结构和算法)

方法递归:在方法执行的内部,自己调用了自己内部的过程。
public void test(){
text();
}
两个过程:递过程:不断调用自身,直到走到函数的终止条件,第一阶段结束。
归过程:函数不断返回的过程。

2.2 什么场景下可以用方法递归?

a.一个大问题可以拆分成若干个子问题的解。
b.拆分后的子问题和原问题除了数据规模不同,解决思路完全相同。
c.必须存在递归的终止条件。

2.3 咋样写出递归代码?

在写递归函数时,千万不要纠结函数内部咋实现,而要注意这个方法的语义(这个方法到底有什么方法),你就假设这个方法别人已经写好了,只需要自己拿来调用而已。
写出递归代码分为以下几步:终止条件+不借助任何方法就能实现的步骤+剩下的问题利用这个方法去解决。
递归函数的关键:方法调用时程序会卡在方法的调用处,直到方法继续运行。

2.4使用递归的练习

2.4.1  使用递归求N的阶乘

import java.util.Scanner;

public class Diguijiecheng {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个整数N:");
        int num = sc.nextInt();
        System.out.println("N的阶乘为:"+ sum(num));
    }
    public static int sum ( int num){
        if (num == 1){
            return 1;
        }
        return num * sum (num - 1);
    }
}

//运行结果

请输入一个整数N:
4
N的阶乘为:24 

2.4.2  使用递归解决青蛙跳台阶问题 

青蛙一次可以跳一节台阶,也可以跳2节台阶,求青蛙跳n节台阶一共有多少种方法。

import java.util.Scanner;

public class Frog {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入台阶个数:");
        int num = sc.nextInt();
        System.out.println("有"+jump(num)+"种方法");
    }
    public static int jump(int num) {
        if (num == 1 || num == 2) {
                return num;
            }
            return num = jump(num - 1) + jump(num - 2);
        }
    }

//运行结果

请输入台阶个数:
20
有10946种方法 

可以类比为斐波那契数。

2.4.3 计算1+2+3+...+n的和。 

import java.util.Scanner;

public class He {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个整数:");
        int num = sc.nextInt();
        System.out.println("1到这个数之间所有的整数和:"+sum(num));
    }
    public static int sum(int num){
        if (num  == 1){
            return 1;
        }
        return num + sum (num -1);
    }
}

//运行结果

请输入一个整数:
5
1到这个数之间所有的整数和:15 

2.4.4 用归找出数组的索引

public class DiGui {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9};
        System.out.println(sum(arr,9,0, arr.length - 1));
    }
    public static int sum (int[] num ,int toFind ,int left,int right){
        if(left > right){
            return -1;
        }
        int mid =(left + right ) / 2;
        if (num[mid] == toFind){
            return mid;
        }else if(toFind < num[mid]){
            return sum(num,toFind,left,mid - 1);
        }
           return sum(num, toFind, mid + 1 , right);
    }
}

// 运行结果

2.4.5汉诺塔问题

public class HannoiTower {
    public static void main(String[] args) {
        int n = 3;
        hannoiTower(n,'A','B','C');
    }
    public static void hannoiTower(int nDisks, char A,char B,char C){
        if(nDisks == 1){
//直接一步到位,用不到B,A上的这个盘子直接给到C。
            move(nDisks,A,C);
            return;
        }
        hannoiTower(nDisks-1,A,C,B);
//n >= 2,先把顶上的n - 1个盘子从A移动到B。
//剩下n个盘子,直接把第n个盘子从A移动到C。
        move(nDisks,A,C);
//再把n - 1个盘子从B移动到C。
        hannoiTower(nDisks-1,B,A,C);
    }
    public static void move(int nDisks,char sourceTower,char destTower){
        System.out.println("编号为"+nDisks+"的盘子正在从"+sourceTower+"移动到"+destTower);
    }
}

//运行结果

编号为1的盘子正在从A移动到C
编号为2的盘子正在从A移动到B
编号为1的盘子正在从C移动到B
编号为3的盘子正在从A移动到C
编号为1的盘子正在从B移动到A
编号为2的盘子正在从B移动到C
编号为1的盘子正在从A移动到C 

 

3.每日一汤 

      谁会记得昨天吃了什么?记得三天前吃了什么?你的菜单是什么?你记不住了,但是这些东西成为了你的养分。读书也是这样,我们并不需要记住那些精彩的段落,我们只需要去读,慢慢的就成为了我们的养分。也许今日所学,你并不完全记忆,但是每日去积累,总有那么一天,你会剥开那层云雾,看见蓝天。加油,求学小子! 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值