Java中递归的简单应用

Posted new-one

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中递归的简单应用相关的知识,希望对你有一定的参考价值。

递归是一种非常常见的编程技巧,它可以将一个复杂的问题分解成更小的问题,然后递归地解决这些小问题,最终得到整个问题的解。递归的本质就是函数调用自身。

我们来看一个简单的例子:计算阶乘。阶乘是指将一个数和它以及它之前的所有正整数相乘的结果,通常用符号"!"表示。例如,5的阶乘就是5! = 54321 = 120。使用循环可以很容易地计算出阶乘,但是如果要求一个特别大的数的阶乘,循环就会变得非常慢,甚至可能导致溢出。这时候,使用递归就能提高代码效率,同时避免溢出。

下面是计算阶乘的递归实现代码:

public static BigInteger getJc(int i) 
    if (i == 1) 
        return BigInteger.valueOf(1);
     else 
        return BigInteger.valueOf(i).multiply(getJc(i - 1));
    

这个代码片段使用了一个名为getJc的静态方法来递归地计算阶乘。当传入的参数i等于1时,返回1;否则,返回i乘以getJc(i-1)的结果。这里使用了BigInteger类来表示阶乘的结果,以避免溢出。

在主函数中调用getJc(100)就能得到100的阶乘。由于100的阶乘非常大,使用递归可以更快速地得到结果,并且不会发生溢出。

递归不仅可以使用在计算阶乘这样的简单问题上,还可以应用在其他许多问题中。例如,二叉树的遍历、图的深度优先遍历、字符串的全排列等等。

但是,递归也有一些缺点。递归需要额外的内存空间来存储递归调用栈,当递归深度较大时,可能会导致栈溢出错误。此外,递归有时可能会使代码难以理解和维护。因此,在实际编程过程中,应该谨慎使用递归,权衡其优缺点。

总之,递归是编程中一种非常重要的技巧。它可以让我们巧妙地解决一些复杂的问题,提高代码效率,避免溢出。

java应用简单递归

毕业后就怎么学过算法,还在上学的时候学过数据结构,现在基本上都还给老师了,可惜老师学费没有还给我。。。

情景: 类似于给定一个数字,算他由多少个数字组成,比如:36 现在有10、5、1 ,那么最佳帅3个10,1个5,1个1组成(默认优先取最大)。因为我们这边业务上面需要开发票,有的时候不想一个一个算,就让我们写一个。但是他发票的个数不是固定的、无尽的,所以每次就要判断下,如果:36 现在基数还是10、5、1 但是 只让你拿1个10、2个5、若干个1,那么组合应该是:1个10,2个5,16个1,大概就是这个意思。

添加两个list,一个存放基数(从大到小)另外一个存放基数的对应个数。

     List list = new ArrayList();
        list.add(10);
        list.add(100);
        list.add(1);
        list.add(20);
        list.add(50);
        list.add(5);
        Collections.sort(list, Collections.reverseOrder());
        List list2 = new ArrayList(); 
        list2.add(1);  //100对应个数(下同)
        list2.add(4); //50
        list2.add(1); //20
        list2.add(20); //10
        list2.add(50); //5
        list2.add(1000); //1

下面就是递归了。。没有啥难度。。参数分别是: 输入的总数,集合的初始下标,基数集合,基数个数集合

public void c(int totle, int flag, List list, List list2) {
        //System.out.println("当前总额" + totle + ",当前额度" + list.get(flag));
        int sum = 0;
        for (int i = 0; i < list.size(); i++) {
            sum += (int) list.get(i) * (int) list2.get(i);
        }
        if (sum < totle) {
            System.out.println("发票总额不够,请添加发票!!!!");
        } else {
            if (totle % (int) list.get(flag) == 0) {
                int s = totle / (int) list.get(flag);
                //System.out.println(s + "");
                if (s > (int) list2.get(flag)) {
                    System.out.println("需要" + list.get(flag) + "元的发票" + s + "张,目前只有" + list2.get(flag) + "张,全部使用!");
                    totle -= (int) list2.get(flag) * (int) list.get(flag);
                    System.out.println(totle);
                    c(totle, ++flag, list, list2);
                } else {
                    System.out.println("需要" + list.get(flag) + "元的发票" + s + "张");
                }

            } else {
                int s = totle / (int) list.get(flag);
                if (s > (int) list2.get(flag)) {
                    System.out.println("需要" + list.get(flag) + "元的发票" + s + "张,目前只有" + list2.get(flag) + "张,全部使用!");
                    totle -= (int) list2.get(flag) * (int) list.get(flag);
                    System.out.println(totle);
                    c(totle, ++flag, list, list2);
                } else {
                    totle = totle % (int) list.get(flag);
                    System.out.println("需要" + list.get(flag) + "元的发票" + s + "张");
                    System.out.println(totle);
                    c(totle, ++flag, list, list2);
                }

            }
        }
    }

假设:

c(365, 0, list, list2);

输出

如果输入超过所有的总额,那么如下:

 

很简单,记录一下,也是提醒下自己,算法也是蛮重要的。。。没事也要跟着慢慢研究!!! 

 

以上是关于Java中递归的简单应用的主要内容,如果未能解决你的问题,请参考以下文章

Java基础------递归(Java实现)

java应用简单递归

简单说明什么是递归?什么情况会使用?并使用java实现一个简单的递归程序。

尾递归和JAVA

Java递归总结

Java 递归的简单学习与理解