无限递归通常是不希望的,当它发生时通常会导致堆栈溢出或段错误.
但是出于理论的缘故和普通的好奇心,我一直在想是否有可能有意识地创造实际的无限递归.
在C++和C中工作,其中堆栈通常为每个函数调用增长,并且每个函数返回并弹出它处理的堆栈部分.
这是想法.是否可以强制函数清除它自己的堆栈空间然后调用另一个函数,以便新函数有效地替换第一个函数,而第一个函数不需要返回,然后通过循环再次触发.
我不只是考虑将普通循环作为一种可能的用途,如果有的话.循环通常可以很好地完成他们的工作.但是,如果您使用它通过节点网络发送信号,那么它会在自己的进程线程中无限期地继续运行,直到它们达到某个条件.它可能是一个可用于解决某些问题的工具.
记住,我不是在问它是否实用,只有在可能的情况下.对于科学!
Bjö*_*lex 15
是否可以强制函数清除它自己的堆栈空间然后调用另一个函数,以便新函数有效地替换第一个函数
这用于尾调用优化,所以是的,它可以在实践中使用.在像C++这样的语言中,这是一个很好的特性,因为有时使用递归表示算法更简单,但使用循环更有效地实现算法.在某些情况下,转换可以由编译器自动完成.
有一种称为trampolining的技术,用于在不使用尾调用优化的情况下实现连续传递样式编程.如果您考虑任何不支持TCO的语言(例如JavaScript)以及该语言的CPS研究解决方案,那么该解决方案很可能涉及蹦床.
从本质上讲,通过蹦床,有一个叫做蹦床的函数,它迭代地调用thunk-returns函数.
我知道你说"没有第一个函数需要返回然后再通过循环再次触发" - 这就是蹦床 - 但考虑到这是C++,例如,返回范围是C++核心设计的核心.通过析构函数进行自动资源管理(参见:RAII).您也可以使用C setjmp()/ longjmp()函数来清除堆栈,但是在确保正确释放所有资源时需要非常小心.