直接转化
简单的递归可以直接转换,如:定义简单几个变量,保存中间结果
阶乘转换-递归写法
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<BinaryTreeNode> 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<BinaryTreeNode> 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);
}
}
}