(C ++)递归函数 - 不知道为什么会递减

时间:2017-10-01 15:00:50

标签: c++11 recursion

我刚开始使用递归函数,并了解c ++的一些工作原理,但我真的不明白这段代码是如何工作的:

    void q9_draw_triangle(int a, int b) {

        // a is the starting point, b is the end
        if (a > b) return;

        // print pattern first
        for(int i = 0; i < a; i++){
            std::cout << "-";
        }
        std::cout << std::endl;

        // call on triangle where a is incremented once
        q9_draw_triangle(a+1,b);

        // print pattern last
        for(int i = 0; i < a; i++){
            std::cout << "-";
        }
        std::cout << std::endl;

    }

我从q9_draw_triangle(a + 1,b)开始得到上半部分的工作原理,但不是最后一个for循环。当我使用调试器逐步执行此代码时,一旦&gt; b发生了它跳到最后一个右大括号,然后到最后一个for循环,然后开始绘制三角形的后半部分并将自身减少回到起始值。我不知道为什么会这样,或者怎么会知道这样做会减少。

编辑:如果需要进一步说明,请说我的输入是a = 3和b = 7. q9_draw_triangle的第一部分(a + 1,b)和up将绘制3行,然后是4,5,6 ,7。然后它转到最后一个右括号,然后到最后一个for循环并绘制7;回到最后一个右大括号,回到for循环并绘制6,然后重复5,4,3。为什么这样做?它永远不会超过最后一个循环再次循环并减少自己,这就是我不知道的。然后当它达到a = 3时它最终退出该函数,它如何知道这样做?

理解这一点的任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

递归是一个函数调用自身的时候,所以你最终会得到一个函数层次结构。如果我定义了一个递归函数void func(int a),那么层次会看起来像这样。

func(1) 
   - func(2) 
        - func(3) 
             - ...

在满足某些条件后,例如&gt; 5,然后函数提前返回,并返回调用它的函数(父函数)。然后父函数运行它的代码直到它返回,从而返回其父函数,依此类推。

有关递归如何工作的示例,请尝试使用Google搜索。这看起来是一个好的起点

https://www.codeproject.com/Articles/32873/Recursion-made-simple

我已经对代码进行了评论,以解释发生了什么。这对我来说很有意义,但我希望它对你也有意义。

void q9_draw_triangle(int a, int b) {

    // this is our condition; this states when to stop the recursion
    if (a > b) return;

    // print current line
    // this loop draws the horizontal lines 
    // if a = 3, then it will draw ---
    for(int i = 0; i < a; i++){
        std::cout << "-";
    }
    std::cout << std::endl;

    // now that the current line was drawn, draw the next line
    // so if a = 3, now in the next function a will be 4
    // so the next function will print ----, which gives us an output of
    // ---
    // ----
    q9_draw_triangle(a+1,b);  // this jumps back up to the top of the function and reruns the function with a+1 until a > b. 

    // once a > b, the functions return one by one and the follwoing loop is run
    // in our example, a was 3 and then 4. If b was 4, then in our next iteration a would be 5, 
    // and the recursive function would simply return because a > b.
    // this code is run once the child function returns. So a would be 4 again, printing ----
    // this gives an output of 
    // ---
    // ----
    // ----
    for(int i = 0; i < a; i++){
        std::cout << "-";
    }
    std::cout << std::endl;
    // here the function retunrs again, so the we get back to the second loop 
    // and a will be 3 again.
    // so the total output is 
    // ---
    // ----
    // ----
    // ---
}

答案 1 :(得分:1)

让我们看看这个函数的结构为

print_block(a)
       recursive_call(a+1, b)
print_block(a)

这种结构使得每个递归级别“挂钩”连续的。例如,如果我们有a=1, b=2,则生成的调用序列将是

print_block(1)
       print_block(2)
               recursion stops: 3>2
       print_block(2)
print_block(1)

当递归停止时,最里面的调用a=3返回而没有任何打印或其他调用。然后控件将传递给它的调用者,即a=2,它将打印并返回,将控制传递给a=1,打印并返回原始调用者(可能是main)。你可以看到为什么a似乎减少了:我们现在以逆序顺序遍历递归。