从递归到迭代的方法在我多年的编程中,我经常使用递归来解决简单的问题,但我完全意识到,有时由于内存/速度问题,您需要迭代。所以,在很久以前的某个时候,我试着去寻找是否存在任何“模式”或教科书方法来将一种常见的递归方法转换为迭代,却一无所获。或者至少我记忆中的任何东西都不会有帮助。有一般规则吗?有“模式”吗?
3 回答
慕娘9325324
TA贡献1783条经验 获得超4个赞
通常,我将通常传递给递归函数的参数推送到堆栈中,从而将递归算法替换为迭代算法。实际上,您正在将程序堆栈替换为您自己的程序堆栈。
Stack<Object> stack; stack.push(first_object); while( !stack.isEmpty() ) { // Do something my_object = stack.pop(); // Push other objects on the stack. }
注意:如果您的内部有多个递归调用,并且希望保留调用的顺序,则必须将它们以相反的顺序添加到堆栈中:
foo(first); foo(second);
必须代之以
stack.push(second); stack.push(first);
ABOUTYOU
TA贡献1812条经验 获得超5个赞
void quicksort(int* array, int left, int right) { if(left >= right) return; int index = partition(array, left, right); quicksort(array, left, index - 1); quicksort(array, index + 1, right); }
void quicksort(int *array, int left, int right) { int stack[1024]; int i=0; stack[i++] = left; stack[i++] = right; while (i > 0) { right = stack[--i]; left = stack[--i]; if (left >= right) continue; int index = partition(array, left, right); stack[i++] = left; stack[i++] = index - 1; stack[i++] = index + 1; stack[i++] = right; } }
尚方宝剑之说
TA贡献1788条经验 获得超4个赞
似乎没有人讨论递归函数在主体中多次调用自己的位置,并处理返回到递归中的特定点(即不是原始递归)的问题。据说每个递归都可以转化为迭代。看来这是可能的。
我只是想出了一个C#的例子来说明如何做到这一点。假设您有下面的递归函数,它的作用类似于一个后继遍历,而AbcTreeNode是一个具有指针a、b、c的三叉树。
public static void AbcRecursiveTraversal(this AbcTreeNode x, List<int> list) { if (x != null) { AbcRecursiveTraversal(x.a, list); AbcRecursiveTraversal(x.b, list); AbcRecursiveTraversal(x.c, list); list.Add(x.key);//finally visit root } }
迭代解决方案:
int? address = null; AbcTreeNode x = null; x = root; address = A; stack.Push(x); stack.Push(null) while (stack.Count > 0) { bool @return = x == null; if (@return == false) { switch (address) { case A:// stack.Push(x); stack.Push(B); x = x.a; address = A; break; case B: stack.Push(x); stack.Push(C); x = x.b; address = A; break; case C: stack.Push(x); stack.Push(null); x = x.c; address = A; break; case null: list_iterative.Add(x.key); @return = true; break; } } if (@return == true) { address = (int?)stack.Pop(); x = (AbcTreeNode)stack.Pop(); } }
添加回答
举报
0/150
提交
取消