好的,我正在读书跳到c ++,并且我已成功进入第16章,这是关于递归的。我阅读了这一章并观看了很少的YouTube视频,所以我想我知道它们是如何工作的。但当我试图理解书中给出的这个代码时,我失败了。 根据我的理解,此代码应打印1234567899 。我评论了我无法理解的行/部分。 在解释时请非常具有描述性,因为我想彻底清除我的怀疑。
#include <iostream>
using namespace std;
void printNum (int num)
{
cout << num ;
if ( num < 9 )
{
printNum( num + 1 ); //if statement should continue untill 123456789 prints on screen
}
cout << num; // this should print only 9 and after that program should exit.
}
int main ()
{
printNum( 1 );
}
答案 0 :(得分:3)
printNum(9)
打印什么?希望您可以看到它输出99
,因为if
为假。
那么printNum(8)
会打印什么?好吧,printNum
在这种情况下做了三件事。首先,它输出8
,即cout << num ;
部分。然后它会输出99
(因为如果printNum(num + 1)
为8,那就是num
将会执行的操作,请参阅第一段)。然后它输出8
,因为这是下一行代码。因此printNum(8)
将输出8998
。
那么printNum(7)
会打印什么?首先7
,然后调用输出printNum(8)
的{{1}}(参见第二段)。然后输出8998
。因此7
将输出printNum(7)
。
继续此分析。
答案 1 :(得分:1)
为{em>每次调用cout << num
打印最后一个printNum
。递归调用printNum
9次。这就是为什么你的第二条评论this should print only 9...
并不完全准确。它会为9
打印printNum(9)
,是的,但之后还会8
打印printNum(8)
等等。
printNum
结束后,程序控件将返回到printNum
的之前的调用。因此,例如,在printNum(9)
完成后,它会返回printNum(8)
以在结尾处打印第二个8
。
答案 2 :(得分:0)
你不理解递归,伙计。首先在树状结构中逐步绘制算法,然后你会很好理解。
在第一个函数调用num = 1第一个cout完成并且新调用进入堆栈而第二个cout没有执行,现在num = 2并且再次执行第一个cout并且第二个cout保持在堆栈中等等