Functional programming 如何实施';国家驱动';以功能的方式运行程序?

Functional programming 如何实施';国家驱动';以功能的方式运行程序?,functional-programming,racket,immutability,Functional Programming,Racket,Immutability,我计划用Racket语言编写一个电路模拟器。 要做到这一点,我必须以任何形式保存整个电路的初始电气状态(如果是Racket,则为列表),并在函数中重复传递该值,直到电路状态进入给定时间。 但是,重复地将数据传递到函数中,这难道不会在堆栈中成长,并最终对程序的性能产生影响吗? 我听说在递归函数的情况下,在编译时,代码首先扩展到递归完成的最后阶段,然后从嵌套最深的一个开始,一次计算一个。 如果同样的情况也适用于这种情况(不仅是我的,也适用于任何包含状态机的程序),我是否应该依赖这种语言勉强提供的可变

我计划用Racket语言编写一个电路模拟器。
要做到这一点,我必须以任何形式保存整个电路的初始电气状态(如果是Racket,则为列表),并在函数中重复传递该值,直到电路状态进入给定时间。

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

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

如果模拟器的“主循环”允许,“堆栈”不会无限增长。本质上,函数调用不需要“推送”堆栈上的参数;而是跳转到函数的开头,重用参数


尝试在此处搜索或查找尾部位置的示例(或否)。

这些是实施细节。通常,因为递归是循环的唯一方式,函数式语言非常擅长循环,所以你不需要在意。你对解释单子的答案感兴趣吗?或者可能解释函数式反应式编程?除此之外,你只需要按照你所描述的对确定性系统演化进行尾部递归,或者非尾部递归,对不确定性系统演化进行深度优先探索。@lukstafi和Ingo感谢他们的回答。在我的例子中,系统是确定性的,我认为我应该只使用尾部递归——但基本上这是编译器所做的,所以除了调用函数之外,我没有什么需要做的了,对吧?经过更多的阅读,我明白了你的意思。所以我只需要适当的尾部呼叫。