递归打印星形图案 P>对于我的C++数据结构类,我们的任务是打印这样的恒星图案:P> < /P>
*递归打印星形图案 P>对于我的C++数据结构类,我们的任务是打印这样的恒星图案:P> < /P>,c++,recursion,printing,C++,Recursion,Printing,* ** **** **** **** **** ** * 模式中的行数由用户输入确定。因此,如果用户输入4,将打印上面的模式 我们之前有一个作业,我们必须打印相反的图案,一个像这样的 **** **** **** ** * * ** **** **** **** 如果用户输入5,则会打印上面的图案。这个模式,上面的那个,我没有问题。我使用for循环打印上半部分,然后再次递归调用该函数,然后使用相同的for循环以相反的方向打印下半部分。以下是我用于上述模式的代码供参考: int main() {
**
****
****
****
****
**
*
模式中的行数由用户输入确定。因此,如果用户输入4,将打印上面的模式 我们之前有一个作业,我们必须打印相反的图案,一个像这样的 ****
****
****
**
*
*
**
****
****
****
如果用户输入5,则会打印上面的图案。这个模式,上面的那个,我没有问题。我使用for循环打印上半部分,然后再次递归调用该函数,然后使用相同的for循环以相反的方向打印下半部分。以下是我用于上述模式的代码供参考:
int main()
{
int number;
cout << "Enter the number of lines in the grid: ";
cin >> number;
printStars(number);
cout << endl << "Grid Pattern Complete - End of Program.";
return 0;
} // end of main
void printStars(int num)
{
if (num < 0) cout << endl << "Please enter a non negative number." << endl;
else{
if (num == 0) return;
else{
for (int q = 1; q <= num; q++)
{cout << "*";}
cout << endl;
printStars(num - 1);
for (int q = 1; q <= num; q++)
{cout << "*";}
cout << endl;
}
}
} // end printStars
intmain()
{
整数;
数量;
印刷星号(编号);
我建议使用两个递归函数,一个按递增顺序打印,另一个按递减顺序打印
在两个函数运行后,保存程序的副本
然后,您可以尝试创建一个函数,该函数同时执行星号的递增和递减顺序。递归调用后,您不会打印星号:
void printStars(int num, int num2)
{
if (num2 < num)
{
for (int e = num; e > num2; e--)
{
cout << "*";
}
cout << endl;
printStars(num - 1, num2);
for (int e = num; e > num2; e--)
{
cout << "*";
}
cout << endl;
}
}
void printStars(int num,int num2)
{
如果(num2num2;e--)
{
cout如果你想递归地做这件事,你必须记住有多个状态:你计数到N
的状态,以及你计数回到1
的状态。因此,如果你必须递归地做,你需要跟踪那些额外的事情:
void printStarsImpl(int count, int initial, int sign)
↑ ↑ ↑
current termination next step
这个函数只需要知道下一个调用哪个printstarsiml()
最初的呼叫是:
void printStars(int n) {
printStarsImpl(1, n, +1);
}
尝试此操作。这是代码的最小修改版本。上限传递给所有递归,递归函数调用以1开头的值执行(第一行中只有1开始):
如果使用声明为只有一个参数的函数,最简单的方法是在函数中使用静态局部变量
#include <iostream>
void print_stars( size_t n )
{
static size_t m;
if ( m++ != n )
{
for ( size_t i = 0; i < m; i++ ) std::cout << '*';
std::cout << std::endl;
print_stars( n );
}
--m;
for ( size_t i = 0; i < m; i++ ) std::cout << '*';
std::cout << std::endl;
}
int main()
{
while ( true )
{
std::cout << "Enter a non-negative number (0-exit): ";
size_t n = 0;
std::cin >> n;
if ( !n ) break;
std::cout << std::endl;
print_stars( n );
std::cout << std::endl;
}
return 0;
}
如果您不想在递归函数中使用静态变量,则可以使用标准流成员函数width
来替代它
#include <iostream>
#include <iomanip>
void print_stars( size_t n )
{
std::streamsize m = std::cout.width();
if ( m++ != n )
{
std::cout.width( m );
std::cout << std::setfill( '*' );
std::cout << '*' << std::endl;
std::cout.width( m );
print_stars( n );
}
std::cout.width( m-- );
std::cout << std::setfill( '*' );
std::cout << '\n';
}
int main()
{
while ( true )
{
std::cout << "Enter a non-negative number (0-exit): ";
size_t n = 0;
std::cin >> n;
if ( !n ) break;
std::cout << std::endl;
print_stars( n );
std::cout << std::endl;
}
return 0;
}
#包括
#包括
无效打印星星(大小)
{
std::streamsize m=std::cout.width();
如果(m++!=n)
{
标准:计算宽度(m);
std::cout为了便于练习,使用递归函数打印星号,使用另一个函数确定星号的数量如何:
string ReturnStars(int number)
{
if (number > 1)
return "*" + ReturnStars(number -1);
return "*";
}
void PrintStars(int start, int lines)
{
cout << ReturnStars(start) << endl;
if (start < lines)
PrintStars(start + 1, lines);
cout << ReturnStars(start) << endl;
}
int main()
{
int numberLines = 1;
cout << "Please enter a positive number to print a star pattern for: ";
cin >> numberLines;
PrintStars(1, numberLines);
return 0;
}
字符串返回星(整数)
{
如果(数字>1)
返回“*”+返回星(数字-1);
返回“*”;
}
无效打印星(整数开始,整数行)
{
我认为如果只使用一个递归函数,最好的答案应该是-
#include <iostream>
using namespace std;
void recursive(int current, int lastEnter, int limit, bool isLimitReached) {
cout << "*";
if(current == lastEnter ) {
cout << endl;
current = 0;
if(isLimitReached == false)
lastEnter++;
else lastEnter--;
}
if(current + 1 == limit) {
isLimitReached = true;
}
current++;
if(!(isLimitReached == true && lastEnter == 0))
recursive(current, lastEnter, limit, isLimitReached);
}
int main()
{
int num = 0;
cout << "Enter max number of stars to be generated : ";
cin >> num;
recursive(1, 1, num, false);
return 0;
}
使用递归是赋值的一部分吗?不使用递归似乎很容易做到这一点recursion@dwcanillas是的,赋值需要递归。这是正确处理它的唯一方法,只是指出打印模式的函数不应该假设任何关于参数值来源的信息。你应该能够使用这个有趣的方法操作与来自文件的参数、硬编码的参数等无缝连接。输入验证属于输入。@Darianidsani:我已经包含了一个答案,对您的代码做了一点修改。它按预期工作。它与您一样使用带额外参数的递归。我已经在ideone.com上对其进行了测试,并将链接和结果包含在我的答案。我不确定是否允许我用两个递归函数来实现它,因为他解释说,你只需要一个函数就可以实现。这很有效,我对它进行了一些调整,以符合要求,但效果非常好,谢谢
#include <iostream>
void print_stars( size_t n )
{
static size_t m;
if ( m++ != n )
{
for ( size_t i = 0; i < m; i++ ) std::cout << '*';
std::cout << std::endl;
print_stars( n );
}
--m;
for ( size_t i = 0; i < m; i++ ) std::cout << '*';
std::cout << std::endl;
}
int main()
{
while ( true )
{
std::cout << "Enter a non-negative number (0-exit): ";
size_t n = 0;
std::cin >> n;
if ( !n ) break;
std::cout << std::endl;
print_stars( n );
std::cout << std::endl;
}
return 0;
}
Enter a non-negative number (0-exit): 4
*
**
***
****
****
***
**
*
Enter a non-negative number (0-exit): 3
*
**
***
***
**
*
Enter a non-negative number (0-exit): 2
*
**
**
*
Enter a non-negative number (0-exit): 1
*
*
Enter a non-negative number (0-exit): 0
#include <iostream>
#include <iomanip>
void print_stars( size_t n )
{
std::streamsize m = std::cout.width();
if ( m++ != n )
{
std::cout.width( m );
std::cout << std::setfill( '*' );
std::cout << '*' << std::endl;
std::cout.width( m );
print_stars( n );
}
std::cout.width( m-- );
std::cout << std::setfill( '*' );
std::cout << '\n';
}
int main()
{
while ( true )
{
std::cout << "Enter a non-negative number (0-exit): ";
size_t n = 0;
std::cin >> n;
if ( !n ) break;
std::cout << std::endl;
print_stars( n );
std::cout << std::endl;
}
return 0;
}
string ReturnStars(int number)
{
if (number > 1)
return "*" + ReturnStars(number -1);
return "*";
}
void PrintStars(int start, int lines)
{
cout << ReturnStars(start) << endl;
if (start < lines)
PrintStars(start + 1, lines);
cout << ReturnStars(start) << endl;
}
int main()
{
int numberLines = 1;
cout << "Please enter a positive number to print a star pattern for: ";
cin >> numberLines;
PrintStars(1, numberLines);
return 0;
}
#include <iostream>
using namespace std;
void recursive(int current, int lastEnter, int limit, bool isLimitReached) {
cout << "*";
if(current == lastEnter ) {
cout << endl;
current = 0;
if(isLimitReached == false)
lastEnter++;
else lastEnter--;
}
if(current + 1 == limit) {
isLimitReached = true;
}
current++;
if(!(isLimitReached == true && lastEnter == 0))
recursive(current, lastEnter, limit, isLimitReached);
}
int main()
{
int num = 0;
cout << "Enter max number of stars to be generated : ";
cin >> num;
recursive(1, 1, num, false);
return 0;
}
Enter max number of stars to be generated : 6
*
**
***
****
*****
******
*****
****
***
**
*