用栈模拟递归解不等式

用栈模拟递归,就是先将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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值