#include <iostream>
#include <cmath>
using namespace std;
int customFunction(int a, int b) {
if (b == 0) {
return a;
}
return a + customFunction(a, b-1);
}
int main() {
int x, y;
cin >> x >> y;
int result = customFunction(x, y);
cout << pow(result, 2) << endl;
return 0;
}
1. 当输入为 2 3 时,customFunction(2, 3) 的返回值为 $64$。( ) 2. (本题为错题,请同时选择【正确】和【错误】获得对应分数)当 $b$ 为负数时,customFunction(a, b) 会陷入无限递归。( ) 3. (本题为错题,请同时选择【正确】和【错误】获得对应分数)当 $b$ 的值越大,程序的运行时间越长。( )
1. 当输入为 5 4 时,customFunction(5, 4) 的返回值为( )。 2. 如果输入 x=3 和 y=3,则程序的最终输出为( )。 3. (4 分)若将 customFunction 函数改为 return a + customFunction(a-1, b-1);,并输入 3 3,则程序的最终输出为( )。
这题核心是读懂递归:customFunction(a,b) 其实是把 a 加了 b+1 次,也就是 a×(b+1)。拿到题先别急着算,把递归展开写几层,一眼就能看出规律,再套进题目给的输入值里算就行。
学生最容易把 customFunction(a,b) 当成 a^b 或者 a×b,结果全错;还有看到“本题为错题,请同时选择正确和错误”这种特殊指令时,机械地只选一个,忘了题目要求两个都选;另外在改函数版本时,容易忽略边界条件 b==0 的返回值,导致最后结果算偏。
这题考的是递归函数的理解与调用,以及递归深度的直观感受。递归说白了就是函数自己调用自己,每次调用把问题拆小一点,直到碰到一个明确的“停止条件”(本题是 b==0),然后一层层把结果拼回去。
customFunction(a, b) 的定义是:
我们把它展开看看:
所以这个函数本质上就是用递归实现了“a 乘以 (b+1)”。
命题人特别喜欢在递归题里埋几个坑: 1. 误以为结果是 a^b 或 a×b——学生看到 a 和 b 两个参数,下意识想乘法或幂,结果全错; 2. 特殊指令陷阱——题目明确说“本题为错题,请同时选择【正确】和【错误】”,很多学生只选一个,或者根本看不懂这种反常识的指令; 3. 改函数后的边界——把递归改成 a + customFunction(a-1, b-1) 时,学生容易忽略 b==0 时返回的是 a(此时 a 可能已经是 0),导致最后结果算偏。