我试图找出一个分配,要求我使用递归而不是循环以某种格式输出一定数量的星号。
基本上,我需要收集用户的输入,并输出看起来像这样的东西Number or asterisks: 5 ***** **** *** ** * ** *** **** *****
我正在努力解决这个问题,因为我一直在考虑通过使用循环而不是递归来解决这个问题。我怎么能输出一定数量的项目并让它知道何时形成一个没有循环的新线?
我真的很难用这个,如果有人可以帮助我弄清楚上半场我有一种感觉我可以自己做第二次。我打赌这将成为我所面临的一个时刻之一,因为没有尽快看到答案而对自己生气!顺便说一下,这是使用c ++,更具体地说是visual studio 2015。
谢谢你们。
答案 0 :(得分:3)
有趣的是,我早期就有很多递归问题。
但你的问题很简单。直接找到最简单的案例,然后将其视为最简单的案例以及如何找到最简单的案例。
递归要求您的函数调用自身,因此您可以将其视为一种堆叠迭代"如果你愿意的话。
关于奇怪的循环和递归之类的东西真有一本非常酷的书,我会高度推荐它:Gödel, Escher, Bach: An Eternal Golden Braid来自Douglas R. Hofstadter。
答案 1 :(得分: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 << "*";
}
星号都在递归调用的返回端打印 - 也就是说,递归调用之后的任何事情都会在调用之前以相反的顺序发生。这意味着换行符将出现在*之前。哪个可能完全没问题,但你需要考虑它。