您能否始终将递归函数转换为迭代函数?是的,绝对可以。如果有记性的话,Church-Turing论文就证明了这一点。用通俗的话说,它可以由递归函数计算,而可以由迭代模型(例如图灵机)计算,反之亦然。这篇论文并没有确切告诉您如何进行转换,但是它确实说有可能。
在许多情况下,转换递归函数很容易。Knuth在“计算机编程的艺术”中提供了几种技术。而且,递归计算的事物通常可以通过完全不同的方法在更少的时间和空间内进行计算。经典的例子是斐波那契数或其序列。您肯定在学位计划中遇到了这个问题。
另一方面,我们当然可以想象有一个如此先进的编程系统,可以将公式的递归定义作为邀请来记住以前的结果,从而提供了速度上的好处,而无需麻烦地告诉计算机准确地执行哪个步骤。遵循具有递归定义的公式的计算。迪克斯特拉几乎可以肯定确实想象过这样的系统。他花了很长时间尝试将实现与编程语言的语义分开。再说一次,他的非确定性和多处理程序设计语言比实际的专业程序员还高。
归根结底,许多功能以递归形式简单易懂,易读和易写。除非有令人信服的理由,否则您可能不应该(手动)将这些函数转换为明确的迭代算法。您的计算机将正确处理该作业。
我可以看到一个令人信服的理由。假设您具有超高级语言的原型系统,例如[ doning石棉内衣 ] Scheme,Lisp,Haskell,OCaml,Perl或Pascal。假设情况如此,您需要用C或Java实现。(也许是出于政治考虑。)那么,您当然可以递归地编写一些函数,但是按字面意义翻译这些函数会使您的运行时系统爆炸。例如,在Scheme中可以执行无限尾递归,但是相同的习惯用法会给现有C环境带来问题。另一个示例是使用词法嵌套函数和静态作用域,Pascal支持,而C不支持。
在这种情况下,您可以尝试克服对原始语言的政治抵制。您可能会发现自己像Greenspun的第十章第十章中那样严重地重新实施Lisp。或者,您可能只是找到了一种完全不同的解决方案。但是无论如何,肯定有一种方法。