【问题标题】:Print out pattern using recursion c++使用递归 C++ 打印出模式
【发布时间】:2018-10-12 10:23:50
【问题描述】:

我正在尝试编写一个程序,给定一个自然数 n,打印出可以找到 here 的模式。到目前为止,它只适用于 n = 2。 我认为我最大的问题是识别递归函数何时应该调用自身。 代码:

void print_line(int n) { // draw a line with n asterisks
    if (n == 0) return;
    for (int i = n; i > 0; i--) {
        cout << "*";
    }
    cout << endl;
}

void print_bars(int n) { // draw the pattern
    if (n == 0) return;
    print_line(n);
    print_bars(n - 1);
    for (int i = n - 1; i > 0; i--) {
        print_bars(i);
    }
}

比起直截了当的答案,我更喜欢提示。谢谢。

【问题讨论】:

  • 似乎最后一个for 循环过多。
  • 因为这应该是一个学习练习,我不想放弃太多。您确定最终条件是您的问题吗?你的输出是什么,它怎么错了? @Banzay,不是针对上述问题,而是有些多余。
  • 提示:在打印** 之后打印**,在*** 之后打印** **,@98765433@31@@987653433@32
  • 不那么神秘:在第 n 个 line 之后打印 (n-1)th pattern 两次
  • 与正确性无关:std::string(n, '*')是n个'*'的字符串,你可以用std::cout &lt;&lt; std::string(n, '*') &lt;&lt; std::endl;替换所有print_line

标签: c++ recursion draw cout


【解决方案1】:

如果我正确理解了这个练习(我认为它的呈现方式很糟糕),你应该在编写实际代码之前重新考虑你的算法。每一步都可以被认为是前一步加上一个部分,在这种情况下它位于顶部,使一切变得容易得多。忘记你的代码,先从抽象的角度解决它。提示:您犯的大错误对应于您的第二个循环的增量部分。

完成后,重新编码。您可以简单地调整一/两行代码,但由于这是一个学习练习,我建议您使用递归,顺便说一句,这通常更有效。

【讨论】:

    【解决方案2】:

    问题是我没有正确考虑实际模式是什么。相反,我试图通过立即编码来模仿它...... 生成的工作代码:

    void print_line(int n) { // draws a line with n asteriscs
        if (n == 0) return;
        cout << string(n, '*') << endl;
    }
    
    void print_bars(int n) { // draws the pattern
        if (n == 0) return;  
        print_line(n);
        print_bars(n - 1);
        print_bars(n - 1);
    }
    

    【讨论】:

      猜你喜欢
      • 2023-01-20
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 2016-05-07
      相关资源
      最近更新 更多