问题描述
我正在竭尽所能,不要在这里含糊其词,所有这些都可以通过while循环解决,但是作为练习,我违背了使用while循环的最佳实践,以期希望学习新知识。
我正在重新学习CPU体系结构的一些基础知识,并认为用“实际的” JMP
逻辑或在软件中尽可能接近它来实现CPU仿真将是一个有趣的项目。
但是,我陷入了上述逻辑的渲染过程。 该代码与该问题无关(根据我的最佳判断) ,但是为了避免倒数第二,逻辑如下:
.LDA 0220
.ASL
.BCC FA
所有这一切都会检查一个寄存器,如果状态标志设置正确,则会向左移一个位,并跳到存储器地址FA
,否则将跳回到.LDA
并再次检查寄存器。
python中的实现对代码中每个步骤的递归函数都相同。 不用说,这超出了最佳实践的范围,但是我认为这对递归和调用顺序是一个有趣的实验。
如果我的数学运算退出,在python停止之前,我将进行16 280次递归调用,而在大约3秒钟后,仅返回到命令提示符。
我已经做了sys.setrecursionlimit(self.dotcount*self.linecount)
来增加递归限制,但这里的目标是能够执行81600个递归(340x240像素,每像素粗略地进行一次递归调用) 。
根据 这是一个坏主意,因为框架很大,所以我尝试纠正这个问题是:
for tb in inspect.stack():
tb.frame.clear()
我也尝试过(绝对不能)使用traceback.clear_frames(tb)
。
死胡同用RuntimeError: cannot clear an executing frame
击中了我RuntimeError: cannot clear an executing frame
。
我最后的求助/问题是:是否有可能减少执行框架,以允许我知道会以圆满结局进行的更多递归调用? 我看不到我什至快要用完RAM,并且应用程序甚至还没有运行到明显慢的速度(我预计在某个时候速度会变慢) 。
如果是这样,我如何释放堆栈跟踪或进一步增加递归深度?
1楼
因此,Python本身没有直接进行尾递归的机制。 但是,有一些有趣的应该会有所帮助。 他们通过在再次进入递归调用之前编辑调用堆栈来进行工作。 非常聪明!