3

我打算用 Racket 语言编写一个电路模拟器。
为此,我必须以任何形式(在 Racket 的情况下为列表)保存整个电路的初始电气状态,并在函数中重复传递该值,直到电路状态进入给定时间。

但这不会重复将数据传递给函数,在堆栈中长大并最终对程序的性能产生影响吗?
我听说在递归函数的情况下,在编译时代码首先扩展到递归完成的最后阶段,然后从最深嵌套的一个开始一次评估一个。
如果这同样适用于这种情况(不仅是我的,而且在任何包含状态机的程序中)我是否应该依赖该语言不情愿地提供的可变数据结构?

在阅读了一堆赞美 FP 的文章后,我也试图做出改变。回首那些经历这些案件的日子,我疯狂地喝着可变状态的kool-aids,现在我感觉自己像个罪犯。
如果问题是另一个重复或类似的问题,请给我一个链接,我会很高兴地接受它并关闭它(或者我可以吗?)。

4

1 回答 1

1

如果您的模拟器的“主循环”允许消除尾调用,则“堆栈”不会无休止地增长。本质上没有必要为函数调用将参数“推送”到“堆栈”上;相反,您跳转到函数的开头,重用参数。

尝试在此处搜索[racket] tail recursion[racket] tail call查找尾部位置的示例(或不查找)。

于 2013-08-13T21:35:52.863 回答