我刚开始使用递归函数,并了解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时它最终退出该函数,它如何知道这样做?理解这一点的任何帮助表示赞赏!
答案 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
似乎减少了:我们现在以逆序顺序遍历递归。