递归地打印n,n-1,n-2,...... 3,2,1,2,3,... n

时间:2015-02-20 02:42:54

标签: c++ algorithm recursion

你好,我有一个功课问题,我被困在..任何提示或提示将不胜感激。问题是:

在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;
}

3 个答案:

答案 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;如下图所示: enter image description here

如果你剥离了这些功能并给自己留下一系列命令,你就会得到:

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