【问题标题】:Which is efficient: a recursive function or a for loop?哪个是有效的:递归函数还是 for 循环?
【发布时间】:2016-05-25 17:25:25
【问题描述】:

我正在编写一个计算阶乘的程序。我们可以使用递归函数或 for 循环。我想知道哪一个有效,为什么?

递归:

int fact(int n)
{
    if(n==0)
    {
        return 1;
    }
    return n*fact(n-1);
}

迭代:

int fact(int n)
{
    int a=1;
    for(int i=1;i<=n;i++)
    {
        a=a*i;
    }
    return a;   
}

【问题讨论】:

  • 既然你都没有提出,我们真的无法回答,不是吗?或者您要的是关于性能基准测试的教程?
  • 没有代码,一个具体的例子,尝试你如何解决它或者你在分析两个版本时的结果只有一个有效的答案:分析它。
  • @Anedar 我已经输入了代码。请再看一遍
  • @kfsone 我已经输入了代码。请再看一遍

标签: c++ for-loop recursion iteration


【解决方案1】:

从一般原理上讲,使用for循环将摆脱函数调用和参数传递的开销。

尽管如此,现代优化编译器在某些情况下可能会优化您的递归代码。在显示汇编代码的this online demo 中,您会看到在 gcc 中使用-O2 生成的汇编代码递归和迭代版本完全相同:

fact(int):                 ; explanation added by me
    testl   %edi, %edi     ; test value of parameter
    movl    $1, %eax       ; take 1 as a return value
    je      .L4            ; if parameter was 0, jump to the return statement
.L3:
    imull   %edi, %eax      ; multiply future return value in register eax by the parameter n in edi register
    subl    $1, %edi        ; substract 1 to n in the edi register
    jne     .L3             ; this loops unitl it's 0 
    rep ret                 ; return 
.L4:
    rep ret

【讨论】:

    【解决方案2】:

    这种递归称为尾递归,基本意思是递归调用是函数中的最后一条语句。任何现代编译器都会将其转换为循环。

    除此之外,只要您使用整数,无论​​如何您只能计算少量阶乘。因此,如果您真的想要性能,请使用查找表。

    【讨论】:

      猜你喜欢
      • 2013-09-19
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      相关资源
      最近更新 更多