你好,我有一个功课问题,我被困在..任何提示或提示将不胜感激。问题是:
在C ++中编写一个递归函数,将正整数n
作为参数,然后打印n, n-1, n-2,...3,2,1,2,3,...n
。你的算法做了多少次递归调用?算法运行时间最差的情况是什么?
我被困在第一部分。编写打印n, n-1, n-2,...3,2,1,2,3,...n
print(int n)
{
if (n==0)
return;
cout<<n<<" ";
print(n-1);
return;
}
但这仅从n
打印到1
我迷失了如何使用一个参数和递归单个函数从2
打印到n
。
我试过这个:它给出了正确的输出,但是有一个循环并有两个参数:
p and z has the same value.
void print(int p,int z)
{
if (p==0)
{
for(int x=2;x<=z; x++)
cout<<x<<" ";
return;
}
else
cout<<p<<" ";
print(p-1,z);
return;
}
非常感谢任何暗示或提示。
所以它现在正在运作,但我无法理解(评论中的问题):
void print(int n)
{
if (n==1){
cout<<n;
return;
}
else
cout<< n;
print(n-1); // how does it get passed this? to the line below?
cout<<n; // print(n-1) takes it back to the top?
return;
}
答案 0 :(得分:8)
您想要的输出是镜像的,因此您可以执行以下一系列步骤:
print num
recursive step on num-1
print num again
那是递归案例。现在你需要一个适当的基础案例来阻止递归,这不应该是困难的。
<小时/> 鉴于伪代码:
recursive_print(n):
if n == 1:
print 1
return
print n
recursive_print(n-1)
print n
(如果您愿意,只需查看您的解决方案)。
让我们追踪它。点将标记我们在打印方面的目标。
. recursive_print(3) // Haven't printed anything
3 . recursive_print(2) 3 // Print the 3
3 2 . recursive_print(1) 2 3 //Print 2
3 2 1 . 2 3 // Print 1
3 2 1 2 . 3 // Print 2
3 2 1 2 3 . // Print 3
每次展开该功能都会在两侧给我们2个数字,然后我们建立到&#34; 1&#34;然后返回并打印剩下的数字。
&#34;展开&#34;如下图所示:
如果你剥离了这些功能并给自己留下一系列命令,你就会得到:
print 3
print 2
print 1
print 2
print 3
其中每个缩进表示不同的功能。
答案 1 :(得分:0)
答案比你想象的要简单。
递归呼叫与常规呼叫没有什么不同。唯一的区别是被调用的函数也是调用者,所以你需要确保你不会永远调用它(你已经这样做了)。让我们考虑一下常规电话。如果您有以下代码段:
statement1
f();
statement2
执行statement1,然后调用f并执行它的操作然后,在f完成后,执行statement2。
现在,让我们考虑一下你的问题。我可以从你编写的第二个程序中看到你在这个问题上的辛勤工作,但是忘了它,第一个程序非常接近答案。
让我们考虑一下你的功能是做什么的。它打印从n到0然后从0到n的所有数字。在第一步,您要打印n,然后打印从n-1到0和从0到n-1的所有数字,并打印另一个n。看看它会去哪里?
所以,你必须做这样的事情:
print(n)
call f(n-1)
print(n)
我希望我的解释足够明确。
答案 2 :(得分:0)
这更像是黑客 - 使用std :: stream而不是递归......
void rec(int n) {
if (n==1) { cout << 1; return; }
cout << n;
rec(n-1);
cout << n;
}
int main() {
rec(3);
}
打印
32123