递归转换循环 作者:马育民 • 2024-12-31 23:20 • 阅读:10004 # 直接转化 简单的递归可以直接转换,如:定义简单几个变量,保存中间结果 ### 阶乘转换-递归写法 ``` private static int factorialByRecurision(int num) { if (num == 1) { return 1; } return num * factorialByRecurision(num - 1); } ``` ### 阶乘转换-循环写法 ``` private static int factorialByLoop(int num) { int result = 1; for (int i = 2; i <= num; i++) { result *= i; } return result; } ``` # 间接转换 对于复杂的递归,使用栈、队列保存中间结果 ### 应用场景 树遍历算法的循环实现 使用方法一般是: ``` 初始状态s0入栈 whle(栈不为空){ 退栈 栈顶元素赋给s if(s是要找的元素) 返回s; else{ 找到s的相关状态s1 s1入栈 } } ``` ### 二叉树遍历-递归实现 用递归实现先序遍历 ``` public static void traversalTreeByRecursion(BinaryTreeNode root) { if (root == null) { return; } System.out.print(root.value + " "); traversalTreeByRecursion(root.leftNode); traversalTreeByRecursion(root.rightNode); } ``` ### 二叉树遍历-循环实现(栈) ``` public static void traversalTreeByLoop(BinaryTreeNode root) { Stack stack = new Stack<>(); stack.push(root); while (!stack.empty()) { BinaryTreeNode temp = stack.pop(); System.out.print(temp.value + " "); if (temp.rightNode != null) { stack.push(temp.rightNode); } if (temp.leftNode != null) { stack.push(temp.leftNode); } } } ``` ### 二叉树遍历-循环实现(队列) ``` public static void traversalTreeByLoop2(BinaryTreeNode root) { Queue queue = new LinkedBlockingQueue<>(); queue.add(root); while (!queue.isEmpty()) { BinaryTreeNode temp = queue.poll(); System.out.print(temp.value + " "); if (temp.leftNode != null) { queue.add(temp.leftNode); } if (temp.rightNode != null) { queue.add(temp.rightNode); } } } ``` 参考: https://blog.csdn.net/Thousa_Ho/article/details/77506664 原文出处:http://malaoshi.top/show_1GWK4no0rdx.html