Java--递归

Java--递归,第1张

Java--递归 递归

普通方法:

递归方法:

递归:递归将原本的问题转化为更小的同一问题(也就是函数/方法调用自身)

使用递归:代码中先写递归到底(递归结束条件)的情况,再写递归调用

先来看一个求累加的问题:1+2+3+…+100

最开始的时候我们使用循环去做,从1一直加到100或从100一直加到1

package com.company.project.homework;

public class homework2 {
    public static void main(String[] args) {
        System.out.println(method15);//15
    }
    
    public static int method1(int x){
        int sum = 0;
        for (int i = 1; i <= x; i++) {
            sum+=i;
        }
        return sum;
    }
}

时间复杂度为O(n)

使用递归

package com.company.project.homework;

public class homework2 {
    public static void main(String[] args) {
        System.out.println(method(5));//15
    }

    public static int method(int x){
        if(x == 1){//递归到底的情况
            return 1;
        }

        return x+method(x-1);//将原来问题转化为更小的同一个问题
    }
}

递归中终止条件的重要性

递归递归,有递必须有归,只递不归会导致栈内存中可分配的空间越来越少,不足以为函数/方法分配空间,从而发生栈溢出错误

其他几个递归例子

  • 斐波那契(不死神兔)

    假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡,问:一对刚出生的兔子,一年内繁殖成多少对兔子?

    package com.company.project.homework;
    
    import java.util.ArrayList;
    
    
    public class homework1 {
        public static void main(String[] args) {
            System.out.println(test(6));
        }
    
    	//参数:月数 返回:n个月后兔子总数
        public static int test(int month) {
            if (month == 1 || month == 2) {
                return 1;
            } else {
                return test(month - 1) + test(month - 2);
            }
        }
    }
    
  • 计算某个数的阶乘 (5!=5*4*3*2*1)

    package com.company.project.homework;
    
    import java.math.BigInteger;
    
    
    public class homework3 {
        public static void main(String[] args) {
            System.out.println(method(BigInteger.valueOf(32)));
            //输出:263130836933693530167218012160000000
        }
    
        //BigInteger  大数运算
        private static BigInteger method(BigInteger b) {
            if(b.equals(BigInteger.ONE)){//BigInteger.ONE:1
                return BigInteger.ONE;
            }else{//multiply:乘  subtract:减
                return b.multiply(methodBig(b.subtract(BigInteger.ONE)));
            }
        }
    }
    

    为什么这里用BigInteger类型作为参数?我们使用integer试一试

    package com.company.project.homework;
    
    import java.math.BigInteger;
    
    
    public class homework3 {
        public static void main(String[] args) {
            System.out.println(method(32));//输出:-2147483648
        }
        //基本数据类型 int -2147483648~2147483647
        private static Integer  method(Integer i) {
            if(i==1){
                return 1;
            }else {
                return i * methodInt(i-1);
            }
        }
    }
    
    • Integer类取值和 int 类型取值一致,取值范围是从-2147483648 至 2147483647

    • 计算阶乘运算结果已经上限,Integer不能再接收返回的值了

  • 一只小猴子一天摘了许多桃子,第一天吃了一半,然后忍不住又吃了一个;第二天又吃了一半,再加上一个;后面每天都是这样吃。到第10天的时候,小猴子发现只有一个桃子了。问小猴子第一天共摘了多少个桃子。

package com.company.project.homework;


public class homework4 {
    public static void main(String[] args) {
        System.out.println(method(10,1));//1354
        System.out.println(method(10));//1354
    }

    
    private static int method(int day,int res) {
        if(day==1){
            return res;
        }
        else{
            day--;
            res = (res+1)*2;
            return method(day, res);
        }
    }

    
    public static int method(int day){
        if(day == 1){
            return 1;
        }
        return (method(day-1)+1)*2;
    }
}
  • 杨辉三角

    package com.company.project.homework;
    
    import java.util.Arrays;
    
    public class homework5 {
        public static void main(String[] args) {
    
            for (int i = 1; i <= 10; i++) {
                System.out.println(Arrays.toString(method(i)));
            }
        }
    
        private static int[] method(int i) {
            int[] arr = new int[i];
            if(i==1){
                arr[0] =1;
                return arr;
            }else{
                arr[0] = arr[i-1] = 1;//每行第一个与最后一个为1
                for (int j = 1; j < i-1; j++) {
                    //中间的数=上一行两数之和
                    arr[j] = method(i-1)[j-1] + method(i-1)[j];
                }
                return arr;
            }
        }
    }
    

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5482612.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存