递归函数中的文本间距,用于打印星形图案

我正在尝试解决递归的练习。这个练习是用C来解决的,但为了方便起见,我首先尝试用C#解决它(我更习惯的地方)。它说:


编写一个程序,其中用户必须输入一个正数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,我坚持认为它必须被排除在外)。


我没有做什么:


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


猛跑小猪
浏览 107回答 1
1回答

月关宝盒

我想,你要找的就是这个。用你的两个处理能力。    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();    }
打开App,查看更多内容
随时随地看视频慕课网APP