递归函数中的文本间距打印星型图案

时间:2019-02-03 09:34:21

标签: c# recursion

我正在尝试解决递归问题。该练习将在C中解决,但是为了简便起见,我首先尝试在C#中解决(我更习惯了)。它说:

  

编写一个程序,其中用户必须输入一个正数n,即n   2的幂(我认为2 ^ 0 = 1必须排除,即使它没有弄清楚这一点),然后借助   递归函数。

     

n = 8的示例,请注意,中线有8个星星:

       * (7 spaces)
      ** (6 spaces)
      *  (6 spaces)
    **** (4 spaces)
     *   (5 spaces)
    **   (4 spaces)
    *    (4 spaces)
******** (0 spaces)
   *     (3 spaces)
  **     (2 spaces)
  *      (2 spaces)
****     (0 spaces)
 *       (1 space)
**       (0 spaces)
*        (0 spaces)
  

n = 4的示例:

   * (3 spaces)
  ** (2 spaces)
  *  (2 spaces)
**** (0 spaces)
 *   (1 space)
**   (0 spaces)
*    (0 spaces)

我已将练习翻译成希腊语,因此,如果我说错话,对不起。我亲自添加了每行必须具有的必要间距,以使您更轻松。

我所做的事情:

我发现了递归函数的结构,即(我发布了程序的整个代码):

static void Main()
{
    int n;
    do
    {
       n = int.Parse(Console.ReadLine());
    }
    while (!IsPowerOf2(n)) ;
    PrintRecursive(n);
}

static void PrintRecursive(int stars)
{
    if (stars > 2)
    {
        PrintRecursive(stars / 2);
        Console.WriteLine(new string(' ',0) + new string('*', stars));
        PrintRecursive(stars / 2);
    }
    else
    {
        Console.WriteLine(new string(' ', 0) + "*");
        Console.WriteLine(new string(' ', 0) + "**");
        Console.WriteLine(new string(' ', 0) + "*");
    }
}

static bool IsPowerOf2(int n)
{
    return (n != 0) && ((n & (n - 1)) == 0);
}

此递归函数会为每个可接受的n生成正确的恒星序列(除了1,我坚持必须将其排除在外)。

我还没有做的事情

我真的找不到公式来计算每个Console.WriteLine()中所需的间距。为了获得模式的正确正确格式,我必须找到一些东西来替换我启动的String类实例中的count参数。

1 个答案:

答案 0 :(得分:0)

我认为,您正在寻找的是这个。借助您的两种处理能力。

    static void Main(string[] args)
    {
        PrintStars(8, 0, 0);
    }

    static void PrintStars(int stars, int prefix, int suffix)
    {
        if(stars == 1)
        {
            PrintStarsToConsole(stars, prefix, suffix);
            return;
        }
        var halfStars = stars >> 1;
        PrintStars(halfStars, prefix + halfStars, suffix); // for n = 4: __**
        PrintStarsToConsole(stars, prefix, suffix);        // for n = 4: ****
        PrintStars(halfStars, prefix, suffix + halfStars); // for n = 4: **__
    }

    static void PrintStarsToConsole(int stars, int prefix, int suffix)
    {
        Console.Write(new string(' ', prefix));
        Console.Write(new string('*', stars));
        Console.Write(new string(' ', suffix));
        Console.WriteLine();
    }