2014-02-21 55 views
4

对不起,对于已经谈过很多次论据的一个非常基本的问题,我只是无法弄清楚答案。我试着搜索论坛已经在主题上提出的问题,但没有找到确切的答案(或不明白它)。为什么递归返回到第一个函数?

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

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

谢谢。

+2

通过调试器和单步执行你的代码到每一行中,你会发现你的答案;) – user376507

+0

请不要标记问题已解决。相反,接受最有用的答案,并保持原样。 –

+0

@EricLippert k,我是新来的论坛,不知道规则,谢谢你的提醒。 – user3338768

回答

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 

为什么shouldn't它返回?
每个函数调用有时都会返回,即使它是递归函数。

+0

递归函数将返回,如果它具有堕胎的条件,否则你将有一个*检查当前标签的地址*;) – halex

+1

我看到了,所以当结束条件满足时,返回最后一个函数,然后倒数第二和直到第一个。出于某种原因,我认为每个函数在调用下一个函数后立即返回,显然是错误的。现在都清楚了。 – user3338768

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 

如果你想像刚刚粘贴,当你看到计数代码(i + 1),你扩大计数时,得到这个(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变量来自你称之为函数的所有不同时间。

+0

现在全部清楚,每个函数都从“最小的一个”返回到第一个。这是我以前不了解的。 – user3338768