用栈模拟递归解不等式

用栈模拟递归,就是先将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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 栈是一种先进后出的数据结构,它支持两种主要操作:推入(push)和弹出(pop)。使用栈实现递归调用的过程主要是:首先将调用参数压入栈中,随后每次从栈中弹出一个参数,并将该参数作为参数调用函数,直到栈为空时,递归调用结束。 ### 回答2: 使用栈实现递归调用的过程,可以通过以下步骤来进行具体描述: 1. 初始化栈,创建一个空栈来存储函数调用的状态。 2. 将初始函数调用的参数压入栈中,同时将函数的入口地址也入栈。 3. 进入循环,判断栈是否为空。如果不为空,则执行以下步骤: a. 弹出栈顶元素,该元素包含函数入口地址和对应的参数。 b. 执行函数体中的代码。 c. 检查函数体中是否存在递归调用。如果存在递归调用,则将递归调用的参数和入口地址压入栈中。 d. 执行函数体中的返回语句,将函数的返回值保存起来。 4. 当栈为空时,退出循环。 通过以上步骤,就可以使用栈实现递归调用。在每次函数调用时,将函数的参数和入口地址压入栈中,然后在函数体中判断是否存在递归调用,并将递归调用的参数和入口地址压入栈中。当函数体执行完毕后,将返回值保存起来,并继续弹出下一个函数的入口地址和参数进行调用。最终,当栈为空时,整个递归调用的过程结束。 ### 回答3: 使用栈可以实现递归调用的过程如下: 在函数调用时,首先将当前函数的参数和局部变量的值保存在栈中。接着,将要调用的函数的参数以及返回地址入栈,并跳转到被调用函数的入口点。 被调用的函数开始执行,执行完成后,将结果存储在某个指定的内存位置中,并将返回地址出栈,将程序的控制权返回给调用者。 调用者检查函数返回的结果,将其复制到期望的位置,并将被调用函数保存在栈中的参数和局部变量恢复到相应的状态。然后,继续执行原来被中断的位置,并继续执行后续的指令。 递归的实现过程中,当函数需要递归调用自身时,首先将当前函数的参数和局部变量的值保存在栈中。然后,将递归调用的参数以及返回地址入栈,并跳转到被调用函数的入口点,开始执行。 当递归调用的函数执行完成后,将结果存储在指定的内存位置,并将返回地址出栈,将程序的控制权返回给调用者。 调用者检查函数返回的结果,并将其复制到期望的位置。接着,将被调用函数保存在栈中的参数和局部变量恢复到相应的状态,并继续执行原来被中断的位置,并继续执行后续的指令。 通过这样的方式,递归调用就可以不断地在栈中重复执行,直到满足终止条件,然后按照出栈的顺序依次返回到每一级的调用者,最终完成递归调用的整个过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值