预期的无限递归,无返回函数

Zoo*_*tor 7 c c++ theory

无限递归通常是不希望的,当它发生时通常会导致堆栈溢出或段错误.

但是出于理论的缘故和普通的好奇心,我一直在想是否有可能有意识地创造实际的无限递归.

在C++和C中工作,其中堆栈通常为每个函数调用增长,并且每个函数返回并弹出它处理的堆栈部分.

这是想法.是否可以强制函数清除它自己的堆栈空间然后调用另一个函数,以便新函数有效地替换第一个函数,而第一个函数不需要返回,然后通过循环再次触发.

我不只是考虑将普通循环作为一种可能的用途,如果有的话.循环通常可以很好地完成他们的工作.但是,如果您使用它通过节点网络发送信号,那么它会在自己的进程线程中无限期地继续运行,直到它们达到某个条件.它可能是一个可用于解决某些问题的工具.

记住,我不是在问它是否实用,只有在可能的情况下.对于科学!

Bjö*_*lex 15

是否可以强制函数清除它自己的堆栈空间然后调用另一个函数,以便新函数有效地替换第一个函数

这用于尾调用优化,所以是的,它可以在实践中使用.在像C++这样的语言中,这是一个很好的特性,因为有时使用递归表示算法更简单,但使用循环更有效地实现算法.在某些情况下,转换可以由编译器自动完成.

  • @akappa:不,尾调用优化正是OP所描述的.如果它是对当前函数的递归调用,那么你最终会得到一个循环,如你所描述的那样; 可以通过擦除当前堆栈帧并分支到另一个函数来实现对另一个函数的尾调用. (8认同)
  • 这不是OP所要求的:尾部调用优化是关于用循环替换递归,而他正在讨论消除为函数调用分配的帧的堆栈. (3认同)

Dan*_*ien 5

有一种称为trampolining的技术,用于在不使用尾调用优化的情况下实现连续传递样式编程.如果您考虑任何不支持TCO的语言(例如JavaScript)以及该语言的CPS研究解决方案,那么该解决方案很可能涉及蹦床.

从本质上讲,通过蹦床,有一个叫做蹦床的函数,它迭代地调用thunk-returns函数.

我知道你说"没有第一个函数需要返回然后再通过循环再次触发" - 这就是蹦床 - 但考虑到这是C++,例如,返回范围是C++核心设计的核心.通过析构函数进行自动资源管理(参见:RAII).您也可以使用C setjmp()/ longjmp()函数来清除堆栈,但是在确保正确释放所有资源时需要非常小心.