任务描述
本关任务:使用递归反向输出整数。
相关知识
函数调用的原理
当在一个函数中调用另一个函数时,第一个函数内部的状态(参数,局部变量)会被保存,然后进入被调用函数。而在被调用函数执行之前,则会先创建出这个函数所需要的状态,之后才开始执行函数中的代码。
这样的函数调用机制,保证了函数在 嵌套调用 时能够按正确的顺序返回,而且对于同一个函数的多次调用,都能保证每一次调用都是独立的(即上一次调用不会影响下一次调用的结果),除非函数中访问了函数范围之外的内容(全局变量,或者外部数据的引用,比如之前提到的数组)。
例如:
int Func(bool ret)
{
int a;
if(ret)
a = 10;
return a;
}
int main()
{
cout << Func(true); //参数为true,Func函数内的a会赋值为10
cout << Func(false); //参数为false,Func内部的a不会被赋值
}
得到的结果是:
10
89809
可见第一次调用Func函数是不会影响第二次调用的。
递归
既然在函数中可以调用其他函数,那么能不能在一个函数中调用它自身呢?答案是可以的。并且我们将这种直接或间接调用自身的过程叫做递归,比如:
int fact(int n)
{
if(n == 0)
return 1;
int v = fact(n - 1); //调用自身
return n * v;
}
在这个函数中,只要n的值不为0,就会不断的调用自身。如果我们调用fact(3),将整个调用流程展开来看就是:
int v = fact(3) //一层一层的往下调用,即“递”。
= 3 * fact(2)
= 3 * 2 * fact(1)
= 3 * 2 * 1 * fact(0)
= 3 * 2 * 1 * 1 //向下结束,开始返回上层,即“归”
= 3 * 2 * 1
= 3 * 2
= 6
编程要求
在右侧编辑器中有一个函数Reverse,它有一个参数n,存有一个非负整数。
请在这个函数中,使用递归技巧反向输出n,输出占一行。
测试数据由评测系统读取,并传递给Reverse函数。具体见测试说明。
测试说明
平台会对你编写的代码进行测试:
测试输入:0
预期输出:0
测试输入:123
预期输出:321
参考代码
#include <iostream>
using namespace std;
void Reverse(int n) {
/********** Begin **********/
if (n == 0) {
cout << 0;
return;
}
// 递归情况:如果 n 不为 0,先递归调用
if (n > 0) {
cout << n % 10; // 输出当前数字的最后一位
if (n / 10 != 0)
Reverse(n / 10); // 递归调用,去掉最后一位
}
//补充代码完成功能
/********** End **********/
}