需要帮助理解递归

时间:2016-10-19 00:25:09

标签: c++ recursion

所以在我class我们正在研究递归函数。但我只是不明白它们是如何工作的。

我将使用此代码作为示例。

// n is written to the screen vertically
// with each digit on a separate line.

void write_vertical(int n) {

    if (n < 10) 
    {
        cout << n << endl;
    }
    else   // n is two or more digits long
    { 
        write_vertical(n/10);
        cout << (n % 10) << endl;
    }
}

因此,如果int n = 123;它会在自己的行上打印每个数字。这会发生怎么回事?这个功能如何逐步运作?

3 个答案:

答案 0 :(得分:3)

按随机数测试(13)

让我们以13为例。好吧,它不小于10,所以它将执行else块,它将立即执行13/10的函数本身,(整数)为1.现在1小于10,因为endl,它将使用新行在屏幕上打印1。现在它将返回到之前的函数调用(在使用参数1再次调用函数之前)并执行13%10。 13模数10是3,因为其余数变为3,具有新线(再次因为endl)。瞧,你用垂直线打印了这个号码!

为了将来

您应该使用铅笔和纸张,并像上面一样手动调试。 OR 甚至可以更好地使用像GDB这样的调试器! This是如何使用GDB进行调试的一个很好的快速启动。

答案 1 :(得分:1)

1:

if(123 < 10)     // fails
    cout << 123; // skipped
else
{
    recurse(123 / 10); // recurse(12) converted to int
    cout << 123 % 10; // i'll be back here wait
}

2:

if(12 < 10)     // fails
    cout << 12; // skipped
else
{
    recurse(12 / 10); // recurse(1)
    cout << 12 % 10; // wiat I'll be back
}

3:

if(1 < 10)      // succeeds! so now else executed
    cout << 1; // printed 

在返回函数之前没有任何内容,所以我们返回 到2:

cout << 12% 10; // (12 % 10 = 2) was wating it's its time

继续下面:没有下面所以从功能2返回到1:

1:

cout << 123 % 10; // it was waiting so now it's its time
cout << 123 % 10; // 123 % 10 = 3

进入下方:功能结束没有任何影响,所以回到主要 第一次调用函数的地方(调用后的行)

结果:1​​23

答案 2 :(得分:1)

递归很简单。假设你已经写好了你的功能;然后使用它。

这是另一种方式 - 你试图弄清楚这个功能是做什么的。同样,当你打电话时,它总是做同样的事情。

因此,在数字n > 10的一般情况下,n/10(整数除法)是什么?这是没有最后十进制数字的数字。

什么是n % 10?这是数字的最后一位十进制数字。

所以,你的定义是:

doing_something for a number `n` IS

    doing_it for this number without its last decimal digit 
                         (if there's something left, that is);

    then printing its last decimal digit and a newline after it.

就是这样。