我打算用Racket语言编写一个电路模拟器
要做到这一点,我必须以任何形式保存整个电路的初始电气状态(如果是Racket的列表),并在函数中重复传递该值,直到电路状态进入给定时间。
但是,不会这样,将数据重复传递到函数中,在堆栈中长大并最终对程序的性能产生影响吗?
我听说过在递归函数的情况下,在编译时代码首先扩展到递归完成的最后阶段,然后从最深层次的嵌套函数中逐个进行评估。
如果同样的情况适用于这种情况(不仅是我的,而且在包含状态机的任何程序中)我是否应该依赖可变数据结构语言而不情愿地提供?
在阅读了一堆赞美FP的文章后,我也试图进行转换。回想起我经历这些案件的日子,现在我觉得自己像个疯子一样喝着可变状态的kool-aids。 如果问题是另一个副本或类似的问题,请给我一个链接,我会高兴地把它关闭(或者我可以吗?)。
答案 0 :(得分:1)
如果模拟器的“主循环”允许tail call elimination,则“堆栈”将无法无限增长。基本上没有必要在函数调用的“堆栈”上“推”参数;相反,你跳到函数的开头,重用参数。
尝试在此处搜索[racket] tail recursion
或[racket] tail call
以查找尾部位置(或不是)的示例。