Java将递归改成循环的通用方法
来源:互联网 发布:mac作图软件 编辑:程序博客网 时间:2024/06/05 05:00
用Stack或LinkedList来实现内存中的出栈入栈过程,即可将递归改成循环。正式开始前先厘清几个概念:循环(loop) - 最基础的概念, 所有重复的行为递归(recursion) - 在函数内调用自身, 将复杂情况逐步转化成基本情况(数学)迭代(iterate) - 在多次循环中逐步接近结果(编程)迭代(iterate) - 按顺序访问线性结构中的每一项遍历(traversal) - 按规则访问非线性结构中的每一项确切地说,递归也属于循环。下文中的「循环」特指非递归的循环。第一个例子用求阶乘,顺便加了迭代方法。[java] view plain copyimport java.util.Stack; public class Factorial{ public static void main(String[] args){ Factorial f = new Factorial(); System.out.println(f.recursion(5)); System.out.println(f.loop(5)); System.out.println(f.iteration(5)); } /** * 递归求阶乘 */ public int recursion(int n){ if (n == 1) return 1; return recursion(n-1) * n; } /** * 循环求阶乘 */ public int loop(int n){ Stack<Integer> stack = new Stack<Integer>(); int result = 1; stack.push(n); while(!stack.isEmpty()){ n = stack.pop(); result *= n; if (n > 1) stack.push(n-1); } return result; } /** * 迭代求阶乘 */ public int iteration(int n){ int result = 1; for(int i = 1; i <= n; i++){ result *= i; } return result; } } 第二个例子是快速排序。递归快排大量数量时,容易爆栈。这时可以改成循环。[java] view plain copyimport java.util.Random; public class Sorts{ private static Random rand = new Random(); public static void main(String[] args){ int[] a = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62 ,99,98,54,56,17,18,23,34,15,35,25,53,51}; quickSort(a); System.out.println(Arrays.toString(a)); int[] a = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62 ,99,98,54,56,17,18,23,34,15,35,25,53,51}; quickSortByLoop(a); System.out.println(Arrays.toString(a)); } /** * 快速排序 * 递归实现 */ private static void quickSort(int[] arr, int start, int end){ if (start >= end) return; int base = arr[start + rand.nextInt(end-start+1)]; //中轴值 int left = start, right = end; //指示左右两端未排序的边界索引 int i = start; // 用于排序 while(i <= right){ if (arr[i] < base){ //小于中轴值则移到左侧 swap(arr, left++, i++); }else if (arr[i] > base){ //大于中轴值则移到右侧 swap(arr, right--, i); //当前i位置的值未排序,故i不自增 }else{ i++; } } //排完后left左侧均为小于base的数,right右侧均为大于base的数 quickSort(arr, start, left-1); quickSort(arr, right+1, end); } /** * 快速排序 * 循环实现 */ private static quickSortByLoop(int[] arr){ Stack<Integer> stack = new Stack<Integer>(); int start = 0; int end = arr.length - 1; stack.push(start); stack.push(end); while(!stack.isEmpty()){ end = stack.pop(); // 顺序很重要 start = stack.pop(); if (start < end){ // 开始排序 int i = start; int base = arr[start + rand.nextInt(end-start+1)] int left = start; int right = end; while(i <= right){ if (arr[i] < base){ swap(arr, left++, i++); }else if (arr[i] > base){ swap(arr, right--, i); }else { i++; } } // ----右半边---- stack.push(right + 1); stack.push(end); // ----左半边---- stack.push(start); stack.push(left - 1); } } } }
0 0
- Java将递归改成循环的通用方法
- Java将递归改成循环的通用方法
- 递归转循环的通用方法
- 通用循环的构造方法
- 将递归转化成迭代的通用技术
- 将递归转化成迭代的通用技术
- 递归将嵌套数组改成二维数组
- 将销售订单中docType改成下拉列表的方法
- 如何用C++递归的方法来将循环链表的unique data找出来
- lamada形式处理递归的通用方法
- 跳出多重循环的通用方法
- java中的递归方法和for循环
- 二分查找的循环和递归方法
- 将以前写的SQL2分查找法通用分页存储过程算法 改成.net类实现
- 将以前写的SQL 2分查找法 通用分页存储过程算法 改成.net类实现
- 将以前写的SQL 2分查找法 通用分页存储过程算法 改成.net类实现
- 将以前写的SQL 2分查找法 通用分页存储过程算法 改成.net类实现
- 将以前写的SQL 2分查找法 通用分页存储过程算法 改成.net类实现
- 【51Nod 1269 】Devu and Flowers
- 聊天室服务端Server
- jquery中$each()方法的使用指南
- NVDIMM在闪存存储中的应用探讨
- Java爬统计局12位区划代码
- Java将递归改成循环的通用方法
- 写好Java代码的30条经验总结
- Android多渠道打包以及分发策略
- ORACLE数据库总结01
- ORACLE数据库总结02
- ORACLE数据库总结03
- 【BootStrap】图片样式、辅助类样式和CSS组件 -附源码
- C++11中bind的使用错误
- ORACLE数据库总结04