我正在尝试解决递归问题。该练习将在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参数。
答案 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();
}