欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

递归转循环

程序员文章站 2022-05-18 20:26:21
...

recursion to stack

问题:把一个递归函数转换成非递归,由于数据量导致栈溢出了。

虽然没有看懂被人写的算法,但是看懂了逻辑结构。主要难点是因为函数主题是一个while true的循环,循环体里面是很多个 if 分支,有的分支会return,有的会改变入参a,有的分支会递归调用被改变后的a并在递归结束后做其他操作也及分支判断。

思路再加一层栈不为空的循环;

入栈元素以及元素入栈时需要做的其他操作,代替完成递归后的操作;

while true 里面的return 和 break 原先是等同的,现在需要改成break,相当于只退出while true;

如果while true里面是switch case 那么case 的 return 要改成break和赋值while true 为false;


void fun(int i) {
	while (true) {
		if (a) {
			i++;
			break;// == return;
		}
		else if(b) {
			i--;
		}
		else if (c) {
			i--;
			fun(i);//recursion
			i++;//next loop
			if (i) {//other judge
				return;
			}
		}
		else {
			i++;
		}

		switch (d) {
		case 1:
			return;
			break;
		case 2:
			i++;
			break;
		case 3:
			i--;
			fun(i);//recursion
			i++;//next loop
			if (i) {//other judge
				return;
			}
			break;
		default:
			i--;
			break;
		}
	}
}


void funStack(int fisrt) {
	struct snode { int i; bool isjudge; };
	vector<snode> S;
	S.push_back(snode{ fisrt,false });
	while (!S.empty()) {
		snode t = S.back();
		S.pop_back();
		int i = t.i;
		if (t.isjudge) { //other judge
			continue;// not return 
		}
		bool whileFlag = true;
		while (whileFlag) {
			if (a) {
				i++;
				break;// == return;
			}
			else if (b) {
				i--;
			}
			else if (c) {
				i--;
				//fun(i);//recursion
				//i++;//next loop
				//if (i) {//other judge
				//	return;
				//}
				S.push_back(snode{ i++,true });//顺序和之前相反
				S.push_back(snode{ i,false });
				break;//while true
			}
			else {
				i++;
			}

			switch (d) {
			case 1:
				//return;
				whileFlag = false;//break while true
				break;
			case 2:
				i++;
				break;
			case 3:
				i--;
				//fun(i);//recursion
				//i++;//next loop
				//if (i) {//other judge
				//	return;
				//}
				S.push_back(snode{ i++,true });//顺序和之前相反
				S.push_back(snode{ i,false });
				whileFlag = false;//break while true
				break;
			default:
				i--;
				break;
			}
		}
	}
	
}

 

相关标签: recursion