用栈模拟递归,就是先将n入栈,不断的将未知元素入栈,直到取到已知的值的时候,出栈进行运算。
网上有一篇将递归用栈模拟的文章,结合二叉树,可以参考:用栈将递归转换成非递归
题目:
T[1] = 1;
up = (n+1)/2;low = n/2;
T(n ) = T(up) + T(low) + n
思路:
用递归思想很好实现,不断对函数进行调用即可,第一次用栈模拟递归,还是给了我很大的启发。递归与栈的思路都一样,从n回溯到已知的值。首先,创建一个数组T,只有T[1]的值已知,将n入栈,求出n/2的上下界,并在数组中看值是否已知,若未知再入栈,直到取到已知值的时候,将元素出栈运算,栈顶元素的值便可以求出来,将数组中元素更新,不断出栈即可求得T[n]的值。
//栈模拟递归的实现
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <stack>
using namespace std;
int fun1(int n)
{
if (n == 1)
return 1;
int t1, t2;
t1 = fun1((n + 1) / 2);
t2 = fun1(n / 2);
return t1 + t2 + n;
}
int fun2(int n)
{
if (n == 1)
return 1;
int* T = new int[n+1];
memset(T, 0, 4*(n+1));
T[1] = 1;
stack<int> S;
S.push(n);
while (S.size())
{
bool flag = false;
int up = (S.top() + 1) / 2, low = S.top() / 2;
if (T[up] == 0) { S.push(up); flag = true; }
if (T[low] == 0) { S.push(low); flag = true; }
if (!flag)
{
T[S.top()] = T[up] + T[low] + S.top();
S.pop();
}
}
return T[n];
}
int main()
{
int n;
while (cin >> n && n != 0)
{
cout << fun1(n) << endl;
cout << fun2(n) << endl;
}
return 0;
}