ACAG 0x02-8 非递归实现组合型枚举

之所以专门来写这道题的博客,是因为感觉从最根本处了解到了递归的机器实现。

主要的就是两个指令——CallRet

Call指令会将返回地址入栈(系统栈),然后跳转到$address$位置的语句。

Ret指令就是返回指令(Return),将返回地址出栈,并跳转到该位置继续执行。

综上,就可以得到组合型枚举的非递归实现了。

#include<bits/stdc++.h>

using namespace std;

int n,m,top,address;
int sta[100010]; vector <int> v; void Call(int x,int ret_addr) {
int old_top=top;
sta[++top]=x;
sta[++top]=ret_addr;
sta[++top]=old_top;
return;
} int Ret() {
int ret_addr=sta[top-1];
top=sta[top];
return ret_addr;
} void Recursive() {
Call(1,0);
while(top) {
int x=sta[top-2];
switch(address) {
case 0:
if(v.size()>m||v.size()+(n-x+1)<m) {
address=Ret();
continue;
}
if(x==n+1) {
for(int i=0;i<v.size();i++) {
printf("%d ",v[i]);
}
printf("\n");
address=Ret();
continue;
}
v.push_back(x);
Call(x+1,1);
address=0;
continue;
case 1:
v.pop_back();
Call(x+1,2);
address=0;
continue;
case 2:
address=Ret();
continue;
}
}
return;
} int main()
{
scanf("%d%d",&n,&m);
Recursive();
return 0;
}

最新文章

  1. [翻译]开发文档:android Bitmap的高效使用
  2. 友盟消息推送和更新XML配置
  3. 使MySQL 支持繁体字
  4. HDOJ-1018 Big Number
  5. curl+个人证书(又叫客户端证书)访问https站点
  6. .net MVC AutoFac基地的环境建设
  7. mysql索引类型-形式-使用时机-不足之处--注意事项
  8. LPC1788做U盘的时候对命令的响应
  9. 判断语句之if..else if...else
  10. .net core2.x 自动注入 Entity(实体对象到上下文)
  11. Linux 细节(杂)
  12. Linux df 与du用法
  13. Docker学习笔记1 -- 刚入手docker时的几个命令
  14. Ucinet6 + Netdraw 根据excel文件绘制网络拓扑图
  15. vue 项目部署后 刷新一下 页面找不到 解决
  16. _T(&quot;D:\\122.txt&quot;)【字符集问题】或【类型转换问题】
  17. 使用UrlRewriteFilter对url进行更替
  18. 在myeclipse中换项目的jdk版本,你需要做哪些?
  19. generator-ivweb 基于react-redux的多页脚手架
  20. flyplane

热门文章

  1. 【bat批处理】批量执行某个文件夹下的所有sql文件bat批处理
  2. 玩转Linux
  3. Android 问题解决 HorizontalScrollView显示不全(转)
  4. POJ-图论-并查集模板
  5. Linux用户查询、新增&amp;删除
  6. 工厂方法(FactoryMethod)模式
  7. Python 入门(1):hello world 到流程控制
  8. python 开机 定时启动
  9. 解决Ajax前台中文传到后台出现中文乱码
  10. pandas-04 多级index操作