0

两天后我参加了考试,我的教授给了我们一个旧考试的解决方案,但是在无数次解决这个问题之后,我无法弄清楚答案到底是怎么回事。

int recursive (int n) {
    if (n < 10) return n;
    return 100 * recursive (n / 100) + 10 * (n % 10);
}
int main(){
    cout << recursive (19683) << endl;
    return 0;
}

答案应该打印出 16030 但我不知道它是如何得到的。我愿意

100*196+10*3 = 19630

然后我做

100*1+10*3 = 130 

如果有人知道如何获得该答案,那完全错误将不胜感激

4

4 回答 4

3

第一次调用 ( recursive(19683)) 返回:

100 * 递归(196) + 10*3

第二次调用 ( recursive(196)) 返回:

100 * 递归(1) + 10*6

第三次调用 ( recursive(1)) 直接返回 1。代回,得到:

100 * (100 * 1 + 60) + 30 = 10000 + 6000 + 30 = 16030

于 2013-05-07T04:52:39.740 回答
1

回到高中,我们被教导要能够对我们的代码进行桌面检查。桌面检查是您手动计算每个步骤的结果的地方。

int recursive (int n) {
    if (n < 10) return n;
    return 100 * recursive (n / 100) + 10 * (n % 10);
}

通过这个 19683

递归(19683)

19683 < 10 为假

返回 100 * 递归 (196) + 10 * (19683 % 10 -> 3)


递归(196)

196 < 10 为假

返回 100 * 递归 (1) + 10 * (196 % 10 -> 6)


递归(1)

1 < 10 为真,返回 1


将 recursive(1) = 1 代入前面的方程...

返回 100 * 1 * 60 -> 160

将 recursive(196) = 160 代入前面的方程...

返回 100 * 160 + 10 * 3 -> 16030

于 2013-05-07T04:54:13.283 回答
1

递归(19683) = 100 * 递归(196) + 10 * 3

递归(196) = 100 * 递归(1) + 10 * 6

递归(1) = 1

现在回填答案

递归(196) = 100 + 60

递归(19683) = 100 * 160 + 30 = 16030

于 2013-05-07T04:59:27.020 回答
0

为了了解发生了什么,请看一个更简单的递归示例,例如反转字符串。在这个问题的答案中有一个很好的解释递归是如何工作的: -

使用递归反转字符串

一旦这对您有意义,您应该会发现理解您提出的示例问题要容易得多。

于 2013-05-07T08:03:04.137 回答