2016-08-16 103 views
4
void func(int num){ 
    if(num< 3){ 
     printf("%d ", num); 
     func(num+ 1); 
     printf("%d ", num); 
    } 
} 

假设我用func(0)调用这个函数。 为什么结果0 1 2 2 1 0? 我不知道为什么它在减少。递归:不明白这个结果

+5

的前三个数字来自第一个printf,第二三个数字来自于第二个printf作为堆解开。为了更好地理解,请尝试'“a:%d”'和'“b:%d”'作为格式字符串。 – user3386109

+0

是的,我明白了,但是为什么它会从2变为0,这对我没有意义? –

+0

你的代码什么都不做,因为函数从来没有被调用过。 –

回答

11

这里有一个堆栈跟踪

f(0) 
    print 0 
    f(1) 
     print 1 
     f(2) 
      print 2 
      f(3) // 3 < 3 == false 
      print 2 
     print 1 
    print 0 
+0

好吧很酷,所以我得到为什么3是错误的,它打印出2.但为什么它之后也打印1和0? –

+1

当您在另一个函数(A)中调用函数(B)时,您不会中断函数(A),一旦被调用函数(B)完成,您将它堆叠并返回到函数 – CMPS

+0

哇,谢谢,我从来没有想到过。这清理了很多东西。 –