为什么添加相同的事物翻转递归

时间:2015-05-21 01:52:47

标签: c++ recursion

我真的不明白。

如果我这样做怎么来

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;

}
        }

我最终得到了这个?! //看来我无法发布图片

   *

  * *

 * * *

* * * *

* * * *

 * * *

  * *

   *

为什么要翻转?

我不理解递归

2 个答案:

答案 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

P1P3是相同的,因此它们必须产生相同的输出,对吗?因此,它打印星星,递归,然后再次打印同一组星。所以,无论你在第一行得到什么,你都会走到最后一行。无论你在第二行得到什么,你都会在最后一行之前上线......

让我以另一种方式解释。尝试逐步打开递归函数:

第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);

  • 调用函数后,lines4lines_org也为4。这将导致第一个for循环产生3 " ",然后第二个循环产生一个" "。结果是" *"

  • 该函数将在循环后调用自身,现在这次lines3lines_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所以条件语句没有被执行而且函数返回

  • 现在,当0lines时,函数已返回到第二对循环,导致1

  • " * * * *"lines时,1lines的函数返回到2。第二个循环导致" * * *"

  • lines2时,lines3的函数返回到" * *"。第二个循环导致lines

  • 3lines时,4" *"的函数返回到lines。第二个循环导致4

  • 调用printStars(4, 4);BOTAN_CFLAGS = `pkg-config botan-1.10 --cflags` system("PAUSE") ; 的函数返回