为什么递归返回第一个函数?

时间:2014-02-21 20:22:32

标签: c recursion tail-recursion

很抱歉提出一个非常基本的问题,关于已经多次讨论的论点,我只是想不通答案。我试着在论坛上搜索已经在主题上提问的问题,但没有找到确切的答案(或者没有理解答案)。

为什么当按不同顺序调用时,此函数会打印从i到10的两倍数字? 它不应该以相同的顺序打印出来吗?我一直听说这是递归的工作方式:每个函数在其代码中调用另一个相同的函数,只应用于较小的域,直到满足结束条件。此时它应该返回(回溯)到原始函数;这是我不明白的,为什么它返回(不打算作为语法调用)到main函数。

void count(int i){
    if(i < 10){
          printf("%d\n", i);
          count(i + 1);
          printf("%d\n", i);
    }
}    

谢谢。

2 个答案:

答案 0 :(得分:6)

7号电话:

count(7)
    output 7
    count(8)
        output 8
        count(9)
            output 9
            count(10)
                end
            output 9
            end
        output 8
        end
    output 7
    end

为什么不回来?
每个函数调用有时会返回,即使它是一个递归函数。

答案 1 :(得分:2)

与任何函数调用一样,最后,执行只是在下一行开始备份:

 printf("%d\n", i);
 // into the function
 count(i + 1);
 // out of the function
 printf("%d\n", i);

重要的是要知道i的值不会更新。它们不是同一个变量。 i有十个不同的“版本”。

 printf("%d\n", i); // i is 3
 count(i + 1);
 printf("%d\n", i); // i is still three, but a version of the function just ran where i is 4

如果你想象在看到count(i + 1)时粘贴代码,你会在扩展count(8)时得到这个:

if(8 < 10){
      printf("%d\n", 8);
      count(8 + 1);
      printf("%d\n", 8);
}

现在粘贴:

if(8 < 10){
    printf("%d\n", 8);
    if(9 < 10){
        printf("%d\n", 9);
        count(9 + 1);
        printf("%d\n", 9);
    }
    printf("%d\n", 8);
}

再次:

if(8 < 10){
    printf("%d\n", 8);
    if(9 < 10){
        printf("%d\n", 9);
        if(10 < 10){
            // we'll never get here
        }
        printf("%d\n", 9);
    }
    printf("%d\n", 8);
}

这是实际运行的代码。 i的“旧”值不会改变。最后,您在调用函数的所有不同时间内有10个不同的i变量。