Question 32

修改递归式后的最终输出

若将 `customFunction` 改为 `return a + customFunction(a - 1, b - 1);`,并输入 `3 3`,程序的最终输出为多少?

单项选择阅读程序4难度 中等

正确答案

D. 36

一句话考点

修改后每层递归同时让 a 和 b 都减 1,相当于求一个递减等差和。

递归程序修改

Shared Context

阅读程序(3)递归累加函数

程序定义了一个递归函数,再对结果平方,考点是递归式理解与终止条件。

递推意义

把递归式写成数学关系 `f(a, b) = a + f(a, b - 1)`,最容易看出它等于 `a * (b + 1)`。

终止条件

只在 `b == 0` 时停下,因此负数会继续往更小的方向递归,永远到不了 0。

输出陷阱

题干有的问返回值,有的问最终输出,后者还要再平方一次。

cpp

共享程序片段
#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;
}

题组阅读提醒

`customFunction(a, b)` 在 `b == 0` 时返回 `a`,否则返回 `a + customFunction(a, b - 1)`,所以本质是把 a 累加了 `b + 1` 次。

主程序里输出的是 `pow(result, 2)`,题目中既考函数返回值,也考最终输出值,两者不能混淆。

本题属于第 阅读程序 分区,题组覆盖题号: 27、28、29、30、31、32

Prompt

题目与选项

若将 `customFunction` 改为 `return a + customFunction(a - 1, b - 1);`,并输入 `3 3`,程序的最终输出为多少?

A. 9

B. 16

C. 25

D. 36

Quick Check

做题抓手

先判断题型

先定位知识点,再决定是公式套用、手推样例还是结构重建。

再核对边界

第一轮很爱在闭区间、下标偏移、递归终止条件和布尔返回值上设陷阱。

最后看输出层次

尤其是阅读程序题,要分清函数返回值、变量值和最终打印值是不是同一件事。

Explanation

详细讲解

  1. Step 1

    设新函数为 `f(a, b)`,则 `f(3, 3) = 3 + f(2, 2) = 3 + 2 + f(1, 1) = 3 + 2 + 1 + f(0, 0)`。

  2. Step 2

    当 `b == 0` 时返回当前的 a,所以 `f(0, 0) = 0`,因此总返回值是 `3 + 2 + 1 + 0 = 6`。

  3. Step 3

    主程序再平方,输出 `6^2 = 36`,所以答案是 D。

Pitfalls

易错点

  • 忘记终止时返回的是“当前 a”,不是最初的 a。
  • 只算出返回值 6,没有再平方。

Extend

拓展补充

  • 修改递归式时,最容易错的是参数的同步变化,建议一步一步手展开到终止条件。

返回总览

回到整套试卷

返回题目总览页,继续从目录、知识图谱或其他分区进入。

所属分区

返回 阅读程序

回到首页对应分区,继续顺序刷题或查看同类知识点。

上一题

第 31 题

输入 3 3 时的最终输出

下一题

第 33 题

① 的起始值