所以在我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;
它会在自己的行上打印每个数字。这会发生怎么回事?这个功能如何逐步运作?
答案 0 :(得分:3)
让我们以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
进入下方:功能结束没有任何影响,所以回到主要 第一次调用函数的地方(调用后的行)
结果:123
答案 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.
就是这样。