【问题标题】:using recursion instead of loops使用递归而不是循环
【发布时间】:2017-03-26 22:54:54
【问题描述】:

我正在尝试找出一个需要我使用递归而不是循环来以某种格式输出一定数量的星号的分配。

基本上,我需要收集用户的输入,并输出类似这样的内容

数字或星号:5
*****
****
***
**
*
**
***
****
*****

我一直在努力解决这个问题,因为我一直在思考如何通过使用循环而不是递归来解决这个问题。我应该如何输出一定数量的项目并让它知道何时形成一个没有循环的新行?

我真的很难做到这一点,如果有人能帮我弄清楚前半部分,我觉得我可以自己完成后半部分。我敢打赌,这将是我面对手掌并为自己没有早点看到答案而生气的时刻之一!顺便说一下,这是使用 c++,更具体地说是 Visual Studio 2015。

谢谢大家。

【问题讨论】:

  • “我应该如何输出一定数量的项目并让它知道何时形成一个没有循环的新行?”只需使用全局变量或将其作为否传递。项作为参数。

标签: c++ recursion


【解决方案1】:

有趣的是,我在早期遇到了很多递归问题。

不过,您的问题很简单。直奔最简单的案例,然后将其视为比最简单的案例多一个以及如何找到最简单的案例。

递归要求您的函数调用自身,因此如果您愿意,可以将其视为一种“堆叠迭代”。

有一本关于奇怪循环和递归之类的非常非常酷的书,我强烈推荐:Gödel, Escher, Bach: An Eternal Golden Braid,Douglas R. Hofstadter 着。

【讨论】:

    【解决方案2】:

    你的主循环可能是这样的:

    void printAsterix(int n)
    {
        printRow(n);
    
        if(n > 1) printAsterix(n - 1);
    
        printRow(n);
    }        
    

    基本上,在“n == 5”上,它会打印一行 5,然后用 n == 4 调用自身,然后打印另一行 5。这将为您提供嵌套外观。

    您还可以在“printRow(n)”的工作方式中使用递归。我建议从那里的一个循环开始,让它全部工作,然后制作一个递归版本的 printRow。 printRow 必须知道在完成后将换行符放在末尾。有了这个,你需要花一点时间逐行考虑递归并计算出事情实际发生的顺序:

    void printRow(int n)
    {
        cout << "*";
    
        if(n > 1)
        {
            printRow(n - 1);
        }
        else
        {
            cout << "\n\n";
        }
    }
    

    在这种情况下,它会为 n 5,4,3,2,1 中的每一个打印一个 *,但随后它会注意到 n 不大于 1,因此它不会再次调用自身,而是打印两个换行符。您需要小心递归伪影,以便命令以正确的顺序发生。例如,如果你写了

    void printRow(int n)
    {
        if(n > 1)
        {
            printRow(n - 1);
        }
        else
        {
            cout << "\n\n";
        }
    
        cout << "*";
    }
    

    星星都被打印在递归调用的返回端——也就是说,递归调用之后的任何事情都以调用之前的相反顺序发生。这意味着换行符将出现在 * 之前。这可能完全没问题,但您需要考虑到这一点。

    【讨论】:

    • 杰森你是个美男子。感谢您的帮助。我曾考虑过包含另一个函数,我知道我需要类似 (n-1) 的东西,但我不确定如何实现它。现在一切都说得通了!当然我需要一个单独的函数来输出!
    • 程序员的生活......总是想知道是否还有别的东西。我因此失眠了
    猜你喜欢
    • 2010-09-17
    • 2021-03-20
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多