我真的不明白。
如果我这样做怎么来
void printStars(int lines,int lines_org){
int i;
if (lines>0){
for(i=0;i<lines-1;i++)
cout<<" ";
for(i=lines-1;i<lines_org;i++)
cout<<" *";
cout << endl;
printStars(lines-1,lines_org);
}
}
打印出来//显示我无法发布图片
* * * * * * * * * *
但是,如果我只是将第一部分添加到最后部分,则将其翻转
void printStars(int lines,int lines_org){
int i;
if (lines>0){
for(i=0;i<lines-1;i++)
cout<<" ";
for(i=lines-1;i<lines_org;i++)
cout<<" *";
cout << endl;
printStars(lines-1,lines_org);
for(i=0;i<lines-1;i++)
cout<<" ";
for(i=lines-1;i<lines_org;i++)
cout<<" *";
cout << endl;
}
}
我最终得到了这个?! //看来我无法发布图片
*
* *
* * *
* * * *
* * * *
* * *
* *
*
为什么要翻转?
我不理解递归
答案 0 :(得分:4)
让我们将您的功能分为3个部分:
void printStars(int lines,int lines_org){
int i;
if (lines>0){
// P1: Print the stars.
for(i=0;i<lines-1;i++)
cout<<" ";
for(i=lines-1;i<lines_org;i++)
cout<<" *";
cout << endl;
// P2: Recurse.
printStars(lines-1,lines_org);
// P3: Print the stars, again.
for(i=0;i<lines-1;i++)
cout<<" ";
for(i=lines-1;i<lines_org;i++)
cout<<" *";
cout << endl;
}
}
你的功能会像这样递归:
P1
|->P1
| |->P1
P2--+->P2 -+->P2
| |->P3
|->P3
P3
P1
和P3
是相同的,因此它们必须产生相同的输出,对吗?因此,它打印星星,递归,然后再次打印同一组星。所以,无论你在第一行得到什么,你都会走到最后一行。无论你在第二行得到什么,你都会在最后一行之前上线......
让我以另一种方式解释。尝试逐步打开递归函数:
第1步:1_star(递归)1_star
第2步:1_star(2_stars(递归)2_stars)1_star
第3步:1_star(2_stars(3_stars(recurse)3_stars)2_stars)1_star
第4步:......
答案 1 :(得分:0)
首先让我们看看这个例子:
void printStars(int lines, int lines_org) {
int i;
if (lines > 0) {
for (i = 0; i < lines-1; i++)
cout << " ";
for (i = lines-1; i < lines_org; i++)
cout << " *";
cout << endl;
printStars(lines-1,lines_org);
}
}
根据您的输出,我可以告诉您将其称为printStars(4, 4);
:
调用函数后,lines
为4
,lines_org
也为4
。这将导致第一个for循环产生3 " "
,然后第二个循环产生一个" "
。结果是" *"
该函数将在循环后调用自身,现在这次lines
为3
(lines_org
仍然是4
)所以它产生3 {{1 }和2 " "
。结果是" *"
该函数再次调用自身," * *"
现在为lines
,结果为2
该函数再次调用自身," * * *"
现在为lines
,结果为1
该函数再次调用自身," * * * *"
现在是lines
,因此条件语句中的代码不会被执行。因此,0
未被调用,因此函数返回
返回后返回到printStars
lines
时。返回到1
lines
时。返回到2
lines
时。返回到3
lines
时。最后,当您调用4
在第二个例子中:
printStars(4, 4);
递归如下:
前几个循环导致void printStars(int lines, int lines_org) {
int i;
if (lines > 0) {
for (i = 0; i < lines-1; i++)
cout << " ";
for (i = lines-1; i < lines_org; i++)
cout << " *";
cout << endl;
printStars(lines-1, lines_org);
for (i = 0; i < lines-1; i++)
cout<<" ";
for (i = lines-1; i < lines_org; i++)
cout << " *";
cout << endl;
}
}
,然后调用" *"
就像第一个示例一样。但是,此调用发生在下一对循环之前
就像第一个例子一样,结果是printStars
。在接下来的几个循环之前再次调用" * *"
就像第一个例子一样,结果是printStars
。在接下来的几个循环之前再次调用" * * *"
就像第一个例子一样,结果是printStars
。在接下来的几个循环之前再次调用" * * * *"
就像第一个例子printStars
现在是lines
所以条件语句没有被执行而且函数返回
现在,当0
为lines
时,函数已返回到第二对循环,导致1
当" * * * *"
为lines
时,1
为lines
的函数返回到2
。第二个循环导致" * * *"
当lines
为2
时,lines
为3
的函数返回到" * *"
。第二个循环导致lines
当3
为lines
时,4
为" *"
的函数返回到lines
。第二个循环导致4
调用printStars(4, 4);
时BOTAN_CFLAGS = `pkg-config botan-1.10 --cflags`
为system("PAUSE") ;
的函数返回