Recursion 是否存在仅以递归方式可行的算法?

Recursion 是否存在仅以递归方式可行的算法?,recursion,iteration,Recursion,Iteration,是否存在仅以递归方式可行的算法?如果是,如何识别这些算法 将以下内容作为一个案例研究 为了近似指数,可以使用 环境足迹≈ 1+f(1+f/2(1+f/3(1+f/4))) 这是一个函数,它使用递归在n个步骤的级别上计算近似值 exp_approximation = function(f, n, i = 2) { if (n == 1) { return( 1 + f/i ) } else { 1 + f/i * exp_appro

是否存在仅以递归方式可行的算法?如果是,如何识别这些算法


将以下内容作为一个案例研究

为了近似指数,可以使用

环境足迹≈ <代码>1+f(1+f/2(1+f/3(1+f/4)))

这是一个函数,它使用递归在n个步骤的级别上计算近似值

exp_approximation = function(f, n, i = 2)
{
    if (n == 1)
    {
        return( 1 + f/i )
    } else
    {
        1 + f/i * exp_approximation(f,n=n-1,i=i+1)
    }

}
是否可以使用迭代而不是递归编写相同的算法


<>我在R中编写了代码,但是我欢迎伪代码中的解决方案,其他一些常用语言,如C、C++、java、python……/p>< p>是的,从技术上讲是可能的。例如,请参见,以获取通用转换方法。这就是说,许多算法在递归形式下更直观(在函数式语言中可能更有效,但在命令式语言中则不然)。对于涉及递归的数学相关问题尤其如此,其中递归实际上是递归关系的表示

递归性确实提高了非递归版本的时间复杂性。因此,一个直截了当的答案是“具有非常高的时间复杂度的算法可能只有在递归方法下才可行”@GrayCygnus它到底是如何提高复杂度的?基本上没有CPU有函数支持,因此编译器通过制作堆栈数据结构来处理参数来伪造它。它与“转换”没有什么不同,因此作为一个进程,它仍然是递归的。@Sylwester不确定“没有CPU有函数支持”是什么意思。当然,功能是一样的,否则实现就不一样了。x86
call
指令调用一个子例程,直到它返回
ret
。没有参数,因此它不支持函数。编译器/解释器必须通过外部数据结构提供参数。许多使用与
调用
使用的数据结构相同的数据结构,因此需要对其进行处理,以便
ret
工作。例如,
call
之前和之后以及
ret
之前的额外代码发挥了神奇的作用,而不是CPU本身。因此,如果机器级别上的递归函数真的不存在,那么手动翻译代码以不使用编译器功能会使其在结果相同时进行迭代吗?@Sylvester通常在算法/软件级别上定义递归。当深入到实现(如asm/二进制形式或HW)时,这可能会发生变化(在某些时候可能会发生变化),但这与输入程序是递归的这一事实并不矛盾。在Scheme中,需要TCO尾部递归的过程通常称为迭代过程。只有当堆栈增长时,它才被称为递归过程。Scheme没有递归以外的其他循环构造,但它有循环的库语法,这些循环变成了迭代递归。想要在递归和迭代之间转换的唯一原因是,生成的代码泄露了堆栈空间太小等限制。它与算法/软件级别没有任何关系。