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中递归的简单应用的主要内容,如果未能解决你的问题,请参考以下文章