2015-11-05 66 views
0

我有问题,理解这个代码:递归在C++函数

#include <iostream> 
using namespace std; 

void Print_numm(int numm){ 
    cout<<numm; 
    if (numm<=4) { 
     Print_numm(numm+1); 
    } 
    cout<<numm; 
} 


int main() { 
    Print_numm(1); 
    return 0; 
} 

输出为1234554321. 我了解递归,直到它打印123455.但是,为什么编译器打印的号码的休息下来1?编译器是否每次都做第二个“cout”?如果是的话,它如何保持数字,直到他们打印到5,然后向下打印剩下的数字?

+4

由于第二个'cout << numm;',它在每个'Print_numm(numm + 1)'处停止并在其完成时继续。 – AntiHeadshot

+0

你能详细说一下吗? –

+0

你为什么不[用调试器进入你的代码](https://www.youtube.com/watch?v=C0vDKXIq_9A)?或者只用一张纸和一支笔手动追踪它? – sashoalm

回答

3

您是否熟悉堆栈?

该函数调用自身并向上打印每个数字,然后从最终的递归调用返回,向下遍历数字,因为它从递归中反复地返回。它只是执行它包含的代码的其余部分递归调用。

的一个简单的表示是:

print_numm(1): 
    cout << 1 
    print_numm(1+1): 
     cout << 2 
     print_numm(2+1): 
      cout << 3 
      print_numm(3+1): 
       cout << 4 
       print_numm(4+1): 
        cout << 5 
//now the number is bigger than 4 so the function 
//will return from recursion 
        cout << 5 
//now the function is done,but the function that called print_numm(5) is waiting to finish 
//so it executes the rest of the code printing 4,same with all waiting for print_numm(4) and so on 
       cout << 4 
      cout << 3 
     cout << 2 
    cout << 1 
+0

谢谢!我想如果条件是真的,第二个cout什么都不做。尽管对我来说这很奇怪,但我应该习惯它。 –

8

如果您直观调用的执行会比较容易理解:

Print_numm(1) 
-> cout 1 
-> Print_numm(2) 
--> cout 2 
-->Print_numm(3) 
---> cout 3 
---> Print_numm(4) 
----> cout 4 
----> Print_numm(5) 
-----> cout 5 
-----> cout 5 
----> cout 4 
---> cout 3 
--> cout 2 
-> cout 1 
0

功能递归从1到5,和这些数字是在第一次调用cout << numm输出(第一行该Print_numm功能。一旦if语句评估为false递归开始展开,并作为Print_numm回电话,他们遇到的最后cout << numm行函数的最后一行,并从5打印到1

2

下面的代码获取的是如何执行的,你可以很容易地分辨这种方式为什么你输出讨论:

Print_numm(1)-> 
    cout<<1 
    Print_numm(2)-> 
     cout<<2 
     Print_numm(3)-> 
      cout<<3 
       Print_numm(4)-> 
       cout<<4 
        Print_num(5)-> 
         cout<<5 
         cout<<5 
       cout<<4 
      cout<<3 
     cout<<2 
    cout<<1 

第二COUT被放置在递归调用后,这意味着它将毕竟内得到执行调用返回。

1

你可以看到它会这样做(假设它返回)。

cout<<1; 
Print_numm(2); 
cout<<1; 

可扩展到:

cout<<1; 
cout<<2; 
Print_numm(3); 
cout<<2; 
cout<<1; 

并最终输出 “1234554321”。

0

,如果你添加了一些额外的诊断你的代码的执行会更容易显现。考虑这种变化:

#include <iostream> 
using namespace std; 

void Print_numm(int numm){ 
    cout << "enter: " << numm << endl; 
    if (numm<=4) { 
     Print_numm(numm+1); 
    } 
    cout << "exit: " << numm << endl; 
} 


int main() { 
    Print_numm(1); 
    return 0; 
} 

主要生产:

enter: 1 
enter: 2 
enter: 3 
enter: 4 
enter: 5 
exit: 5 
exit: 4 
exit: 3 
exit: 2 
exit: 1 

您也可以使用调试器来逐步帮助你更好地理解这种。

一个重要的代码理解原理。 添加良好的诊断功能大大减少了理解所发生的事情所需的精力和能力。

1

由于条件numm < = 4在numm = 5时变为false。 因此,numm停止递增并执行先前调用函数的代码的其余部分。