C编程语言中的递归

-1 c recursion tail-recursion

我现在正在学习递归.这是三个代码.第一个和第三个是给我预期的输出,但第二个不是?有人能告诉我他们的区别是什么.

代码1:

void tail(int i){
if (i>0) {
    printf("%d\n",i);
    tail(i-1);
 }
}

int main()
{
    tail(5);
}
Run Code Online (Sandbox Code Playgroud)

代码2:

void tail(int i){
if (i>0) {
    printf("%d\n",i);
    tail(i--);
 }
}

int main()
{
    tail(5);
}
Run Code Online (Sandbox Code Playgroud)

代码3:

void tail(int i){
if (i>0) {
    printf("%d\n",i);
    tail(--i);
 }
}

int main()
{
    tail(5);
}
Run Code Online (Sandbox Code Playgroud)

代码1的输出:

5 4 3 2 1

代码2的输出:

5 5 5...无穷

代码3的输出:

5 4 3 2 1

请帮帮我.我很迷惑!

suj*_*hvm 5

  1. 结果如预期
  2. 递减是后递减,因此它将首先使用当前值然后递减.所以函数被重复调用当前值,所以无限循环.
  3. 对我来说很好.与第一类似